rrd*_*rrd 12 cakephp associations query-builder conditional-statements cakephp-3.0
我在用户和联系人上有一个belongsToMany关联.
我想找到给定用户的联系人.我需要类似的东西
$this->Contacts->find()->contain(['Users' => ['Users.id' => 1]]);
Run Code Online (Sandbox Code Playgroud)
该烹饪书讲述了包含条件,定制查找器方法和通过关联键唱歌,但我没有找到如何将这些放在一起.
ndm*_*ndm 21
从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]);
});
Run Code Online (Sandbox Code Playgroud)
这将自动将所需的连接+条件添加到生成的查询中,以便仅检索与至少一个具有id的用户相关联的那些联系人1.
如果您通过hasMany和手动设置多对多关联belongsTo,您可以直接定位连接表:
$this->Contacts
->find()
->matching('ContactsUsers', function(\Cake\ORM\Query $q) {
return $q->where(['ContactsUsers.user_id' => 1]);
});
Run Code Online (Sandbox Code Playgroud)
如果您确实想要在结果中返回所有关联,那么只需继续使用contain():
$this->Contacts
->find()
->contain('Users')
->matching('Users', function(\Cake\ORM\Query $q) {
return $q->where(['Users.id' => 1]);
});
Run Code Online (Sandbox Code Playgroud)
这将包含属于联系人的所有用户.
如果您有多个匹配项,并且您只想包含那些匹配项,那么您也必须过滤包含这些匹配项.在这个例子中它没有多大意义,因为只有一个匹配,但在其他情况下它可能是有用的,例如,如果你想匹配所有拥有活动用户的联系人,并检索仅包括联系人活跃的关联用户:
$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');
Run Code Online (Sandbox Code Playgroud)
鉴于可能存在重复项,即单个联系人的多个活动用户,您可能希望相应地对事物进行分组,以避免检索重复的联系人记录.
您还可以使用已知的点标记路径语法,通过这种方式定位更深层次的关联Query::contain().比如说你有一个Users hasOne Profiles关联,并且你想只匹配那些想要接收通知的用户,这看起来像这样:
->matching('Users.Profiles', function(\Cake\ORM\Query $q) {
return $q->where(['Profiles.receive_notifications' => true]);
})
Run Code Online (Sandbox Code Playgroud)
这将自动创建所有必需的附加连接.
通过这些关联和您的简单要求,您还可以轻松地从另一方查询,即通过Users表格,并使用仅Query::contain()包括相关的联系人,如
$this->Users
->find()
->contain('Contacts')
->where([
'Users.id' => 1
])
->first();
Run Code Online (Sandbox Code Playgroud)
然后可以在entities contacts属性中找到所有联系人.