首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cakephp在使用matching()时包含关联

Cakephp在使用matching()时包含关联
EN

Stack Overflow用户
提问于 2015-10-22 18:29:30
回答 1查看 395关注 0票数 0

在我的项目中,我有以下表格:MessagesRecipientsGroupsUsers。一个Message有多个Recipients,一个Recipient有一个Group和一个User

在我的RecipientsTable::beforeFind中,我有一些代码可以自动包含用于Recipient查找的GroupsUsers,因为我总是需要访问这些关联。

代码语言:javascript
复制
public function beforeFind($event, $query, $options, $primary) {
    return $query->contain([
        'Groups',
        'Users',
    ]);
}

我不知道这是不是一个糟糕的设计决定,但到目前为止,它对我来说是有效的。

现在问题来了,我正在尝试按组过滤消息,并尝试使用matching函数来完成此操作:

代码语言:javascript
复制
$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]);
});

当我执行查询时,我得到以下错误:

代码语言:javascript
复制
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没有关联。

EN

回答 1

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33278890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档