我正在尝试将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."
}
根据我的理解,我的左手有问题,但为什么和它是什么,我该如何解决它??
答案 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
方法中设置关系,你只能使用两个第一个参数