从Doctrine 2.1开始,支持CASE WHEN语句,但没有很多文档。我的目标是设置一个布尔值来判断照片是否已被用户收藏:
->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as is_favorited")
->leftJoin("p.favorites", 'f', 'WITH', 'f.owner = :viewer')
->orderBy("p.date_posted", "DESC")
->setParameters(array("owner" => $owner, "viewer" => $viewer));
但是因为我的实体被JMSSerializer转换为json,我想将CASE WHEN结果设置为实体的属性。
->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as p.is_favorited")
但不幸的是,Doctrine似乎并不喜欢这样:
[语法错误]第0行,第65行:错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_FROM,得到'。'
是否有替代方法可以在实体上设置DQL创建的属性?
答案 0 :(得分:2)
无法直接在查询中设置属性值。相反,您可以将未映射的字段添加到实体中,然后遍历结果并进行设置。在这种情况下,JMSSerializer
序列化该字段,您可以在其上设置必要的类型和其他元信息。
答案 1 :(得分:0)
你能试试吗?它适用于DQL
->addSelect("SUM(CASE WHEN f.photo is NULL THEN 0 ELSE 1 END) as p.is_favorited");
答案 2 :(得分:-1)
从错误中听起来它是抱怨的,因为你的select语句中没有列出FROM表。
答案 3 :(得分:-1)
您只需添加
即可->from()
为“F”和
提供表名的行