【问题标题】:Join sub-query after contain joins in CakePHP 3在 CakePHP 3 中包含连接后加入子查询
【发布时间】:2019-11-22 16:57:20
【问题描述】:

我目前在 CakePHP 3 中遇到问题 - 我正在尝试将子查询加入到现有查询中,但是 ORM 在处理“包含”方法之前添加了子查询,但子查询连接依赖于一些包含表。有什么方法可以强制连接在 包含之后运行?

我的代码相当长且复杂,但我会写一个简单的例子:

$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】:

    AFAIK 订单不能(还)受到影响,包含和匹配(这也是 *JoinWith() 方法)将在手动加入后出现,另请参阅 https://github.com/cakephp/cakephp/issues/10746

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

    【讨论】:

    • 明白了,谢谢。用连接替换所有包含解决了我的问题。
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2018-12-02
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2011-12-03
    相关资源
    最近更新 更多