为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据相关模型的条件进行过滤?

/ 猿问

如何根据相关模型的条件进行过滤?

如何根据相关模型的条件进行过滤?

我在用户和联系人上有一个belongsToMany关联。

我想找到给定用户的联系人。我需要类似的东西

$this->Contacts->find()->contain(['Users' => ['Users.id' => 1]]);

该烹饪书讲述了包含条件,定制查找器方法和通过关联键唱歌,但我没有找到如何将这些放在一起。


查看完整描述

1 回答

?
呼如林

使用Query :: matching()或Query :: innerJoinWith()

Contacts表中查询时,您要查找的是,Query::matching()或者Query::innerJoinWith()(仅)Query::contain()

请参阅Cookbook>数据库访问和ORM>查询生成器>按关联数据过滤

以下是使用表格的示例:

$this->Contacts
    ->find()
    ->matching('Users', function(\Cake\ORM\Query $q) {
        return $q->where(['Users.id' => 1]);
    });

这将自动将所需的连接+条件添加到生成的查询中,以便仅检索与至少一个具有id的用户相关联的那些联系人1

定位连接表

如果您通过hasMany和手动设置多对多关联belongsTo,您可以直接定位连接表:

$this->Contacts
    ->find()
    ->matching('ContactsUsers', function(\Cake\ORM\Query $q) {
        return $q->where(['ContactsUsers.user_id' => 1]);
    });

包括遏制

如果您确实想要在结果中返回所有关联,那么只需继续使用contain()

$this->Contacts
    ->find()
    ->contain('Users')
    ->matching('Users', function(\Cake\ORM\Query $q) {
        return $q->where(['Users.id' => 1]);
    });

这将包含属于联系人的所有用户。

限制遏制

如果您有多个匹配项,并且您只想包含那些匹配项,那么您也必须过滤包含这些匹配项。在这个例子中它没有多大意义,因为只有一个匹配,但在其他情况下它可能是有用的,例如,如果你想匹配所有拥有活动用户的联系人,并检索仅包括联系人活跃的关联用户:

$this->Contacts
    ->find()
    ->contain(['Users' => function(\Cake\ORM\Query $q) {
        return $q->where(['Users.active' => true]);
    }])
    ->matching('Users', function(\Cake\ORM\Query $q) {
        return $q->where(['Users.active' => true]);
    })
    ->group('Contacts.id');

鉴于可能存在重复项,即单个联系人的多个活动用户,您可能希望相应地对事物进行分组,以避免检索重复的联系人记录。

深刻的联想

您还可以使用已知的点标记路径语法,通过这种方式定位更深层次的关联Query::contain()。比如说你有一个Users hasOne Profiles关联,并且你想只匹配那些想要接收通知的用户,这看起来像这样:

->matching('Users.Profiles', function(\Cake\ORM\Query $q) {
    return $q->where(['Profiles.receive_notifications' => true]);})

这将自动创建所有必需的附加连接。

改为从另一个表中选择

通过这些关联和您的简单要求,您还可以轻松地从另一方查询,即通过Users表格,并使用仅Query::contain()包括相关的联系人,如

$this->Users
    ->find()
    ->contain('Contacts')
    ->where([
        'Users.id' => 1
    ])
    ->first();

然后可以在entities contacts属性中找到所有联系人。


查看完整回答
反对 回复 2019-08-13
  • 1 回答
  • 0 关注
  • 74 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信