在CakePHP 3中包含连接后加入子查询

问题描述 投票:0回答:1

我目前在CakePHP 3中遇到问题-我试图将子查询联接到现有查询上,但是ORM在处理“包含”方法之前添加了子查询,但是子查询联接依赖于某些包含的表。有什么方法可以强制联接运行after包含吗?

我的代码相当长且令人费解,但是我将写一个简单的示例:

$articles = $this->find()
  ->select(['Articles.id', 'Articles.title', 'Users.id'])
  ->contain(['Users','Tags']);

$subQuery = $this->find()
  ->select(['text' => 'Articles.body', 'user_id' => 'Users.id', 'article_id' => 'Articles.id'])
  ->contain(['Users','Tags']);

$articles
  ->join([
    'ArticleText' => [
      'table' => $subQuery,
      'type' => 'LEFT',
      'conditions' => ['ArticleText.user_id = Users.id', 'ArticleText.article_id = Articles.id']
    ]);

现在此代码过于简单,显然没有必要,但是问题本质上是ORM会生成一个查询,该查询首先尝试执行联接,并且联接将失败,因为还没有联接Users.id。有什么办法可以让包含的内容先运行?

php join cakephp query-builder cakephp-3.x
1个回答
0
投票

AFAIK顺序无法(尚未)受到影响,包含和匹配(也就是*JoinWith()方法)将在手动加入后出现,另请参见https://github.com/cakephp/cakephp/issues/10746

因此,您可能也必须手动加入Users关联,而不是使用contain()

© www.soinside.com 2019 - 2024. All rights reserved.