Cakephp在使用matching()

时间:2015-10-22 10:29:30

标签: cakephp cakephp-3.0

在我的项目中,我有以下表格:MessagesRecipientsGroupsUsersMessage有多个RecipientsRecipient有一个Group和一个User

在我的RecipientsTable::beforeFind我有一些代码可以自动包含GroupsUsers 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没有关联。

1 个答案:

答案 0 :(得分:0)

使用表类自动加载表关联。就像在必要的表类中使用hasMany(),hasOne(),belongsTo(),belongsToMany()一样。

官方文件:
https://book.cakephp.org/3.0/en/orm/associations.html

表文件应该位于Model文件夹内的Table文件夹中,如src \ Model \ Table。 enter image description here