我有两个模型:联系人和具有belongsToMany关联的组。
我想只获得联系人可访问的组。为此,我有一个自定义查找器。
public function findAccessible(Query $query, array $options){
return $query
->where(['admin_user_id' => $options['User.id']])
->orWhere(['public' => true])
->matching('Users', function($q) use ($options){
return $q->orWhere(['Users.id' => $options['User.id']]);
});
}
所以我可以打电话跟随,我会得到我想要的东西。
$accessibleGroups = $this->Contacts->Groups->find('accessible', ['User.id' => $this->Auth->user('id')]);
但是,如果我有一个包含,它将回馈所有组,而不仅仅是可访问的组。
$contact = $this->Contacts->get($id, [
'contain' => ['Groups']
]);
如何将包含限制为可访问?
我无法将自定义查找器添加到表关联定义的finder属性中,因为我无法在那里传递$ options。或者我可以吗?
答案 0 :(得分:6)
让我引用文档和测试(如果您在文档中找不到某些内容,则测试通常是有关如何执行操作的信息的有用来源。)
<强> http://book.cakephp.org/3.0/en/orm/table-objects.html#passing-conditions-to-contain 强>
如果您在关联表中定义了一些自定义查找器方法,则可以在contains:
中使用它们// Bring all articles, but only bring the comments that are approved and // popular. $query = $articles->find()->contain([ 'Comments' => function ($q) { return $q->find('approved')->find('popular'); } ]);
在这种情况下,您可以简单地传递find()
通话中的条件,就像您已经在做的那样。
<强> http://book.cakephp.org/3.0/en/orm/table-objects.html#using-the-finder-option 强>
所以还有一个可以用来代替可调用的“隐藏”finder
选项:
$table->find('all')
->where(['Articles.author_id' => $authorId])
->contain([
'Authors' => [
'finder' => ['byAuthor' => ['author_id' => $authorId]]
]
]);
我想如果在“食谱”中更详细地记录查找器的使用情况,也不会受到影响,Query::contain()
的文档块也缺少有关它的信息。