我正在使用Doctrine进行查询,该查询使用CASE WHEN
来计算自定义字段,如下所示:
公共函数findLatestPaginator($ page = 1,$ itemsPerPage) { $ qb = $ this-> createQueryBuilder('n');
$qb = $qb
->select(['n AS news', 'CASE WHEN lu.id IS NOT NULL THEN 1 ELSE 0 END AS n.liked'])
->leftJoin('n.likingUsers', 'lu')
;
$qb = $qb
->orderBy('n.date', 'DESC')
->setFirstResult($itemsPerPage * ($page - 1))
->setMaxResults($itemsPerPage)
->getQuery()
;
return $qb->getResult();
}
在我的实体中,我有一个名为$liked
的字段,未映射。是否可以使查询(或水化器?)自动在结果实体上设置字段?
现在,我正在进行foreach
循环并手动设置属性:
/**
* @return News[]
*/
private function convertNews(array $records)
{
$newsList = [];
foreach ($records as $record) {
if (isset($record['liked'], $record['news'])) {
/** @var News */
$news = $record['news'];
$news->liked = boolval($record['liked']);
$newsList[] = $news;
}
}
return $newsList;
}
答案 0 :(得分:0)
DTO在这里可能有用:doctrine documentation
基本上,您定义一个未映射到模型的PHP类。 然后,您可以选择所需的内容,并从DQL查询中触发该PHP类的对象的实例化。
希望这会有所帮助!
答案 1 :(得分:-1)
默认 hydrator 不包括未映射的属性(哇,对吧?)。 你想覆盖/扩展学说/orm/lib/Docrtrine/ORM/Internal/Hydration/AbstractHydrator 第 386 行,它只检查 $classMetadata fieldMappings
或者,如果不需要性能,您可以通过在转换器中使用 DTO 和查询来解决