将SQL查询转换为Doctrine,Error

时间:2014-11-27 11:10:57

标签: php mysql symfony doctrine-orm

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

纯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

DOCTRINE查询:

$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."
}

根据我的理解,我的左手有问题,但为什么和它是什么,我该如何解决它??

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您使用的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方法中设置关系,你只能使用两个第一个参数