【问题标题】:Converting SQL query into Doctrine, Error将 SQL 查询转换为 Doctrine,错误
【发布时间】:2014-11-27 11:10:56
【问题描述】:

我正在尝试将 SQL 查询转换为 Doctrine QueryBuilder 查询。 SQL 查询在我的 SQL 控制台 (Workbench) 中按我想要的方式工作。但是当我将我的 SQl 查询转换为 Doctrine 'Query' 时,我收到一个错误,我无法理解.....

纯SQL查询:

    select 
CONCAT('news/', feeds.slug, '/', articles.slug) as 'URL'

from article_feeds
left join articles on article_feeds.article_id=articles.id
left join feeds on article_feeds.feed_id=feeds.id

教义查询:

$stmt = $this->db->createQueryBuilder()
         ->select('faf.article_id', 'faf.feeds_id')
         ->addSelect('f.slug AS feedSlug')
         ->addSelect('a.slug AS articleSlug')
         ->addSelect("Group_CONCAT(DISTINCT CONCAT(feedSlug, '/' , articleSlug) SEPARATOR ',' ) AS url")
         ->from('article_feeds', 'faf')
         ->leftJoin('a', 'article_feeds', 'faf', 'af.article_id = a.id')
         ->leftJoin('f', 'article_feeds', 'faf', 'af.article_id = f.id');


 $this->urls = $stmt->execute()->fetch(\PDO::FETCH_OBJ);

错误:

{
code: 0,
message: "The given alias 'articles' is not part of any FROM or JOIN clause table. The currently registered aliases are: faf."
}

据我了解,我的 leftJoin 存在问题,但是为什么以及是什么,我该如何解决......?

【问题讨论】:

    标签: php mysql symfony doctrine-orm


    【解决方案1】:

    ->leftJoin('faf.articles', 'your_articles_alias')

    【讨论】:

      【解决方案2】:

      您使用 leftJoin 方法错误。

       /*
       * @param string $join The relationship to join
       * @param string $alias The alias of the join
       * @param string $conditionType The condition type constant. Either ON or WITH.
       * @param string $condition The condition for the join
       * @param string $indexBy The index for the join
       * @return QueryBuilder This QueryBuilder instance.
       */
      public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null)
      

      所以你的查询应该是这样的:

      $stmt = $this->db->createQueryBuilder()
           ->select('article_feeds.article_id', 'article_feeds.feeds_id')
           ->addSelect('feeds.slug AS feedSlug')
           ->addSelect('articles.slug AS articleSlug')
           ->addSelect("Group_CONCAT(DISTINCT CONCAT(feedSlug, '/' , articleSlug) SEPARATOR ',' ) AS url")
           ->from('article_feeds', 'article_feeds')
           ->leftJoin('articles', 'articles','ON', 'article_feeds.article_id = articles.id')
           ->leftJoin('feeds', 'article_feeds', 'ON', 'article_feeds.article_id = article_feeds.id');
      

      我不确定这里的关系是否良好,但问题是应该在您的实体类中设置关系 - 然后您不需要在 leftJoin 方法中设置它们,您只能使用两个第一个参数

      【讨论】:

      • 嘿,谢谢你的重播,对不起,如果这可能是一个蹩脚的问题,但实体类是什么......?
      • 嘿,我实际上是直接查询数据库,我的项目中根本没有实体元素/映射。
      • 感谢您的帮助,但您提供的查询仍然不起作用:错误:``{ 代码:0,消息:“给定的别名 'faf.articles' 不属于任何FROM 或 JOIN 子句表。当前注册的别名为:faf。 }
      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多