CakePHP beforeFind导致resetAssociations,阻止ContainableBehavior

时间:2014-05-23 02:33:01

标签: cakephp-2.4

在我的用户模型中,我有函数beforeFind,它增加了从关联模型(TenantsUser)中提取数据的条件。

问题是当它与ContainableBehavior一起使用时。 首先,当调用find时,将调用ContainableBehaviors安装例程,该例程修改User的关联(如预期的那样)。 然后,在我的User / beforeFilter函数中,我调用TenantsUser执行另一个find()调用。但是,在find调用结束时,它会重置所有相关模型的关联(包括用户),这会重置ContainableBehavior已完成的关联构建,因此我的find返回所有关联,而不是Contains中指定的关联。

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果你可以发布一些包含你所看到的数据集的代码,并且对你期望看到的内容进行解释,那么对你来说会更容易。没有它,基本上不可能排除故障。我假设你已经在互联网上找不到成功的答案,这意味着你的问题可能是新问题,因此更多信息至关重要。请务必在模型文件中包含关联定义。

您还提到使用beforeFind然后使用beforeFilter;这是一个错字还是你使用这两个回调?

您是否已阅读此处的bindModel功能?

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly

尽管如此,我总是发现可容纳的行为非常违反直觉。如果您只是在寻找可以运行而不是利用CakePHP内置功能的东西,请尝试使用hasMany through关联,并在链接表上进行查找(如果您正在链接TenantUser您在find表上执行了TenantsUser

答案 1 :(得分:0)

我最终取消绑定并重新绑定模型以解决我的问题,以下代码位于beforeFind()

之内
// If this function is being called with ContainableBehavior being used, then the associations of User
// have already been adjusted to perform the query correctly. However, after find() functions are executed,
// models, and their associated models have their associations reset to defaults.
// Because we execute TenantsUser->find by calling the function below, TenantsUser will reset the associations
// within the User model thereby destroying all the work that ContainableBehavior did.
// For this reason, before calling TenantsUser->find(), we unbind the User Model from the TenantsUser Model, which means
// that the Users associations are NOT reset.
$this->TenantsUser->unbindModel(
        array('belongsTo' => array('User')),
        false   // We have to force the unbind to remain, otherwise the associations will be reset.
    );  

$user_ids = $this->TenantsUser->getUserIdsForTenant($this->getCurrentTenantId(), $tenants_users_statuses);

// Rebind the model.
$this->TenantsUser->bindModel(
    array('belongsTo' => array('User'))
);