18

从 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 创建的属性是否有替代方法?

4

4 回答 4

2

无法直接在查询中设置属性值。相反,您可以将未映射的字段添加到实体中,然后遍历结果并设置它。在这种情况下JMSSerializer,序列化该字段,您可以在其上设置必要的类型和其他元信息。

于 2013-09-03T17:44:01.273 回答
0

你能试试这个。它将与 DQL 一起使用

->addSelect("SUM(CASE WHEN f.photo is NULL THEN 0 ELSE 1 END) as p.is_favorited");
于 2014-12-19T20:41:51.150 回答
-1

从错误听起来像是在抱怨,因为您的选择语句中没有列出 FROM 表。

于 2015-02-05T16:29:56.437 回答
-1

你只需要添加你的

->from() 

为“F”提供表名的行和

于 2015-03-17T16:41:17.680 回答