【问题标题】:How to turn this SQL query into Doctrine Query如何将此 SQL 查询转换为 Doctrine 查询
【发布时间】:2014-04-17 18:08:22
【问题描述】:

我在 symfony 上使用这个本机 SQL 查询(这是一个非常糟糕的做法),但我正在努力让它与 DQL 一起运行而不会触发多个错误。

SELECT Image.path, Image.name 
FROM Image
LEFT JOIN ImageVoters ON Image.id = ImageVoters.image_id
WHERE ImageVoters.voter_id =1
AND ImageVoters.action =  'favourite'
ORDER BY Image.created_at ASC

这就是我目前所拥有的

    public function findMyFavourites()
    {
       return $this->getEntityManager()
       ->createQuery('SELECT p.path,p.name 
       FROM GabrielUploadBundle:Image p 
       LEFT JOIN GabrielUploadBundle:ImageVoters v 
       ON p.id  = v.image_id 
       WHERE v.action ="favourite" 
       ORDER BY p.created_at ASC')
       ->getResult();
    }

由于某种原因它抛出了这个错误

错误:预期的 Doctrine\ORM\Query\Lexer::T_WITH,得到 'ON'

这是有效的查询

$em = $this->getDoctrine()->getManager();
$query = $em->getRepository('GabrielUploadBundle:Image')->createQueryBuilder('p')
    ->select(array('p.path', 'p.name','p.id','p.upvotes','p.imageowner','p.createdAt','p.updatedAt'))
    ->leftJoin('GabrielUploadBundle:ImageVoters', 'v', 'WITH', 'p.id = v.image_id')
    ->where("v.action = 'favourite'")
    ->andWhere("v.voter_id = 1")
    ->orderBy('p.createdAt', 'ASC')
    ->getQuery();

【问题讨论】:

  • 您的查询似乎正确,只需将 ON 更改为 WITH
  • 已经尝试得到 [Syntax Error] line 0, col 204: Error: Expected Literal, got '"'

标签: sql symfony doctrine-orm dql doctrine-query


【解决方案1】:

如果您将ON 更改为WITH,您的查询将正常。
你也可以试试

$query = $em->getRepository('GabrielUploadBundle:Image')->createQueryBuilder('p')
   ->select(array('p.path', 'p.image'))
   ->leftJoin('GabrielUploadBundle:ImageVoters', 'v', 'WITH', 'p.id = v.image_id')
   ->where("v.action = 'favourite'")
   ->orderBy('p.createdAt', 'ASC')
   ->getQuery();
$result = $query->getResult();

【讨论】:

  • 你的查询确实有很多语法错误,但它确实帮助我完成了它,检查编辑答案上的“固定”版本
  • 我选择了更多的字段。
  • 你是对的,但你说的那些错误是因为我不知道你的字段映射中有什么,所以我使用了列名,我认为在你的映射中有一个Image 和 ImageVoters 之间的关系;无论如何,我也更新了我的答案:)
  • 我想你忘记了“WHERE ImageVoters.voter_id =1”部分先生
【解决方案2】:

p此外,如果您的 Image 模型和 Image Entity 类中的 ImageVoters 模型之间存在关系,您可以这样做:

->leftJoin('p.imageVoters', 'v')

Doctrine 将为您完成剩下的工作。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多