如何在 CakePHP 中使用 matching() 查找具有共同父级的实体?
How to find entities with common parent using matching() in CakePHP?
我需要找到与给定文章列表具有相同作者的所有文章
这是我的自定义查找器方法:
public function findSimilar(Query $query, array $options)
{
if (empty($options['idList'])) {
throw new Exception('idList is not populated');
}
// We are given a list of article IDs
$idList = $options['idList'];
return $query->matching('Authors', function ($q) use ($idList) {
return $q->matching('Articles', function ($q2) use ($idList) {
return $q2->where(['Articles.id IN' => $idList]);
});
});
}
不幸的是,我收到以下错误消息:
PDOException:SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'Articles'
我做错了什么?
如果它是一个 HasMany 关系,我们可以很容易地做到这一点:
return $query->where([
'Articles.author_id IN' => $this->find()
->select(['Articles.author_id'])
->where(['Articles.id IN' => $idList])
]);
// 感谢 CakePHP IRC 频道上的 jose_zap
嵌套匹配有很多限制,这可能是其中之一。我无法判断它是否可能是一个错误,因此您可能需要检查 issues on GitHub 并最终提交一个新的文件以进行澄清。
引自文档:
[...] Dotted matching paths should be used over nested matching() calls [...]
Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Filtering by Associated Data
在任何一种情况下,使用点符号而不是嵌套应该可以解决问题,即
return $query->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});
如果您还想在 Authors
上匹配,您可以堆叠匹配器,例如
return $query
->matching('Authors', function ($q) {
return $q->where(['Authors.foo' => 'bar']);
})
->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});
我需要找到与给定文章列表具有相同作者的所有文章
这是我的自定义查找器方法:
public function findSimilar(Query $query, array $options)
{
if (empty($options['idList'])) {
throw new Exception('idList is not populated');
}
// We are given a list of article IDs
$idList = $options['idList'];
return $query->matching('Authors', function ($q) use ($idList) {
return $q->matching('Articles', function ($q2) use ($idList) {
return $q2->where(['Articles.id IN' => $idList]);
});
});
}
不幸的是,我收到以下错误消息:
PDOException:SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'Articles'
我做错了什么?
如果它是一个 HasMany 关系,我们可以很容易地做到这一点:
return $query->where([
'Articles.author_id IN' => $this->find()
->select(['Articles.author_id'])
->where(['Articles.id IN' => $idList])
]);
// 感谢 CakePHP IRC 频道上的 jose_zap
嵌套匹配有很多限制,这可能是其中之一。我无法判断它是否可能是一个错误,因此您可能需要检查 issues on GitHub 并最终提交一个新的文件以进行澄清。
引自文档:
[...] Dotted matching paths should be used over nested matching() calls [...]
Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Filtering by Associated Data
在任何一种情况下,使用点符号而不是嵌套应该可以解决问题,即
return $query->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});
如果您还想在 Authors
上匹配,您可以堆叠匹配器,例如
return $query
->matching('Authors', function ($q) {
return $q->where(['Authors.foo' => 'bar']);
})
->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});