在我的用户模型中,我有函数beforeFind,它增加了从关联模型(TenantsUser)中提取数据的条件。
问题是当它与ContainableBehavior一起使用时。 首先,当调用find时,将调用ContainableBehaviors安装例程,该例程修改User的关联(如预期的那样)。 然后,在我的User / beforeFilter函数中,我调用TenantsUser执行另一个find()调用。但是,在find调用结束时,它会重置所有相关模型的关联(包括用户),这会重置ContainableBehavior已完成的关联构建,因此我的find返回所有关联,而不是Contains中指定的关联。
如何解决这个问题?
答案 0 :(得分:0)
如果你可以发布一些包含你所看到的数据集的代码,并且对你期望看到的内容进行解释,那么对你来说会更容易。没有它,基本上不可能排除故障。我假设你已经在互联网上找不到成功的答案,这意味着你的问题可能是新问题,因此更多信息至关重要。请务必在模型文件中包含关联定义。
您还提到使用beforeFind
然后使用beforeFilter
;这是一个错字还是你使用这两个回调?
您是否已阅读此处的bindModel
功能?
尽管如此,我总是发现可容纳的行为非常违反直觉。如果您只是在寻找可以运行而不是利用CakePHP内置功能的东西,请尝试使用hasMany through
关联,并在链接表上进行查找(如果您正在链接Tenant
和User
您在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'))
);