在我的项目中,我有以下表格:Messages
,Recipients
,Groups
和Users
。 Message
有多个Recipients
,Recipient
有一个Group
和一个User
。
在我的RecipientsTable::beforeFind
我有一些代码可以自动包含Groups
和Users
Recipient
次发现,因为我总是需要访问这些关联。
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和表B上使用matching
,则查找前使用contain
加载C,C结束up包含在原始查询(A)中,执行失败,因为A与C没有关联。
答案 0 :(得分:0)
使用表类自动加载表关联。就像在必要的表类中使用hasMany(),hasOne(),belongsTo(),belongsToMany()一样。