Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3中包含联接后的联接子查询_Php_Join_Cakephp_Query Builder_Cakephp 3.x - Fatal编程技术网

CakePHP 3中包含联接后的联接子查询

CakePHP 3中包含联接后的联接子查询,php,join,cakephp,query-builder,cakephp-3.x,Php,Join,Cakephp,Query Builder,Cakephp 3.x,我目前在CakePHP 3中遇到了一个问题-我试图将子查询连接到现有查询上,但是ORM在处理contain方法之前添加了子查询,但是子查询连接依赖于一些包含的表。有没有办法强制联接在contain之后运行 我的代码相当长且复杂,但我将编写一个简单的示例: $articles = $this->find() ->select(['Articles.id', 'Articles.title', 'Users.id']) ->contain(['Users','Tags'])

我目前在CakePHP 3中遇到了一个问题-我试图将子查询连接到现有查询上,但是ORM在处理contain方法之前添加了子查询,但是子查询连接依赖于一些包含的表。有没有办法强制联接在contain之后运行

我的代码相当长且复杂,但我将编写一个简单的示例:

$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尚未联接。有没有办法让contains先运行?

如果顺序还不能受到影响,那么也是*JoinWith方法的containment和matching将在手动联接之后运行,另请参见


因此,您可能也必须手动加入用户协会,而不是使用contain。

明白了,谢谢。用联接替换所有包含解决了我的问题。