在我的项目中,我有以下表格:Messages、Recipients、Groups和Users。一个Message有多个Recipients,一个Recipient有一个Group和一个User。
在我的RecipientsTable::beforeFind中,我有一些代码可以自动包含用于Recipient查找的Groups和Users,因为我总是需要访问这些关联。
public function beforeFind($event, $query, $options, $primary) {
return $query->contain([
'Groups',
'Users',
]);
}我不知道这是不是一个糟糕的设计决定,但到目前为止,它对我来说是有效的。
现在问题来了,我正在尝试按组过滤消息,并尝试使用matching函数来完成此操作:
$possible_groups = [1,2,3]; //just an example
$query->matching('Recipients', function($q) use ($possible_groups){
return $q->where(['Recipients.group_id IN' => $possible_groups]);
});当我执行查询时,我得到以下错误:
Messages is not associated with Groups有没有办法让我的beforeFind保持这样,并且能够使用匹配?或者,有没有更好的方法来自动加载关联,而不使用beforeFind?
TL;DR: A hasMany B,B hasOne C。如果表A上的查询使用表B上的matching,而表B的beforeFind使用contain加载C,则C最终包含在(A的)原始查询上,并且执行失败,因为A与C没有关联。
发布于 2017-12-02 18:38:20
使用表类自动加载表关联。比如在必要的表类中使用hasMany()、hasOne()、belongsTo()、belongsToMany()。
官方文档:
https://book.cakephp.org/3.0/en/orm/associations.html
表文件应该位于Model文件夹内的Table文件夹中,如src\Model\Table。

https://stackoverflow.com/questions/33278890
复制相似问题