在CAKEPHP中,我们能否动态地更改链接到特定模型的表格?

7
假设我有两个结构相同的表格(称为“tableA”和“tableB”)。
我想将某些数据保存在“A”表中,某些数据保存在“B”表中。
现在我想同时使用相同的模型来操作这两个表格。
我希望根据控制器上的条件动态更改与模型相连的表格(例如“ModelM”)。
例如:
在控制器中://示例代码
function saveProduct(){

    $this->loadModel('ModelM');

    if(condition){

        $this->ModelM->useTable = 'A';

    }else{

        $this->ModelM->useTable = 'B';

     }
     $this->ModelM->save($this->data);

}

2011年1月14日更新

以下是我正在处理的代码剪贴板:

function experiment(){

    $tableName = 'temp_table'.'1234';

    mysql_query('CREATE TABLE '.$tableName.' LIKE temp_home_masters');

    $sql = $this->createInsertQuery($new_arr,$tableName);

    $status = mysql_query($sql);

    if($status){
        echo "saved successfully";
    }else{
        echo "error";
    }

    $this->NewHomeMaster->setSource($tableName);//NewHomeMaster was previously attached to a different table , here I want to change the tableName the model linked with dynamically.Model 'NewHomeMaster' already exists and uses a table ...Here I am willing to link this model to the newly created tempory table.//

    $home_details=$this->paginate('NewHomeMaster',array($new_conditions));

    mysql_query('DROP table '.$tableName);

}

很遗憾,这不起作用...

3个回答

3

我最初是想找到解决方案来解决你的问题,但是我越思考,我认为你的逻辑是有缺陷的。

我可以理解两个表相似或相同的事实可以导致您决定使用单个模型与两个表进行交互。 但是,当您查看模型应该是什么(在CakePHP中基本上是一种与表交互的接口)时,来回切换就没有意义了。

CakePHP文档对模型的解释如下:

在面向对象编程中,数据模型是表示“事物”的对象,例如汽车、人或房屋。

在您的示例中,您实际上有两个完全相同的“事物”。 因此,它们应该具有自己的模型。

如果您的模型真的将具有完全相同的方法,则“CakePHP方式”将是定义一个自定义Behavior,用于封装共享方法。 然后将行为附加到两个模型上。

然后,在控制器条件下可以加载您需要的模型:

private $DynamicModel;

public function saveProduct() {
    if (condition) {
        App::import('Model', 'ModelZ');
        $this->DynamicModel = new ModelZ;
    } else {
        App::import('Model', 'ModelY');
        $this->DynamicModel = new ModelY;
    }
    $this->DynamicModel->save($this->data);
}

我的问题有些不同,我只是通过举例来解释它...我想动态创建一个随机表(与现有表完全相同),进行一些复杂的计算(avg_price),然后将现有表复制到这个新表中,并添加一个名为“avg_price”的新列...现在我想使用“order by”对“avg_price”字段对动态创建的表进行分页...分页后,我会删除该表.... - Libu
每次运行脚本时,都会创建一个表->进行计算->将带有计算字段的旧表复制到新表中->对新表进行分页并设置数据以供查看->删除表... - Libu
我们能否动态创建临时表并将模型分配给它? - Libu
我不明白这个需求。为什么要复制表格?不如直接计算平均值,避免所有额外的步骤。 - Stephen
我建议升级到CakePHP1.3并使用虚拟字段。 升级过程并不痛苦,我已经完成了。 http://book.cakephp.org/view/1561/Migrating-from-CakePHP-1-2-to-1-3 - Stephen
显示剩余2条评论

2

0

情况比较棘手,正如Stephen所描述的那样,因为你的方法有点违反MVC约定。

然而,如果你愿意走向自定义黑客的领域,你可以考虑在CakePHP中创建自己定制的数据源来处理这种逻辑。一种选择是扩展给定的数据源(可能是MySQL),使用自己的自定义逻辑来执行一些初步过滤/调整,然后再与数据库交互。虽然逻辑放置在错误的范围内不太干净,但可能会起作用。首先看看这里:http://book.cakephp.org/view/1075/DataSources

或者,你可以创建两个不同的模型,并使用行为使它们共享相同的逻辑。这有点限制了你在流程中早期选择模型的选择(因此不仅影响数据存储位置),但可能是一个选择。


数据源可能很有趣,但确实有些危险! - Stephen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接