在 CakePHP 3 中包含连接后连接子查询
Join sub-query after contain joins in CakePHP 3
我目前在 CakePHP 3 中遇到问题 - 我正在尝试将子查询连接到现有查询,但是 ORM 在处理 "contain" 方法之前添加子查询,但子查询连接依赖于一些包含的表。有什么办法可以强制加入 运行 after 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()
方法)将在手动连接之后出现,另请参见 https://github.com/cakephp/cakephp/issues/10746.
所以您可能也必须手动加入 Users
协会,而不是使用 contain()
。
我目前在 CakePHP 3 中遇到问题 - 我正在尝试将子查询连接到现有查询,但是 ORM 在处理 "contain" 方法之前添加子查询,但子查询连接依赖于一些包含的表。有什么办法可以强制加入 运行 after 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()
方法)将在手动连接之后出现,另请参见 https://github.com/cakephp/cakephp/issues/10746.
所以您可能也必须手动加入 Users
协会,而不是使用 contain()
。