我正在Symfony实体类中添加一个虚拟属性。该属性应根据另一个表数据计算,特别是在条令数组类型的列上。
class RelatedEntity
{
/* ... */
/**
* @ORMColumn(type="array")
*/
protected $type;
重点是我想使用条令标准,因为它应该在SQL级别上进行优化。所以我做了这个:
public function getCreated()
{
$criteria = Criteria::create()->where(Criteria::expr()->contains('type', 'create'));
$relatedEntity = $this->getRelatedEntities()->matching($criteria);
if (!$relatedEntity) {
return null;
}
return $relatedEntity->getTimestamp();
}
但我得到了一个空的结果集。尽管Doctrine正在构建一个正确的SQL语句,当我手动将其键入PostgreSQL数据库时,它仍然有效。
...WHERE type LIKE '%create%'
这种方法有什么问题,如何解决现在我用ArrayCollection filter方法完成了这个技巧,但它加载了我不需要的所有相关实体。
谢谢你的意见。
EDIT:这不是上述问题的重复,因为我不能在实体内使用EntityManager或EntityRepository。我需要使用Criteria,所以问题中提出的解决方案对我不起作用。
检查getRelatedEntities()
的结果
根据此集合的创建方式,可能会发生以下任何一种情况。特别是,它可能使用实体别名,也可能不返回任何与您的Criteria
匹配的别名。
- 从别名实体填充的集合(即:通过QueryBuilder联接/选择)。
- 如果
getRelatedEntities
是由Doctrine通过QueryBuilder填充的,那么您很可能已经对实体进行了别名处理 - 例如:
$queryBuilder->addSelect('thing')->leftJoin('root_alias.entity', 'thing')
- 在这种情况下,标准必须使用别名:
Criteria::expr()->contains('thing.type', 'create')
- 如果
- 没有符合条件的项。
- 在筛选集合之前先转储集合,这可能是查询已经筛选出任何潜在匹配项的简单情况
测试您的标准
综合考虑,在没有任何线索的情况下,你试图过滤的集合的结构,我们只能评估你的标准。因此,请测试您的条件,并检查要筛选的集合的内容。
$criteria = Criteria::create()->where(Criteria::expr()->contains('type', 'create'));
$collection = new ArrayCollection([
[
'key' => 1,
'type' => 'somethingcreatesomething',
],
[
'key' => 2,
'type' => 'abra',
],
[
'key' => 3,
'type' => 'cadabra',
],
[
'key' => 4,
'type' => 'alacreate',
],
]);
dump($collection->matching($criteria));
结果
DoctrineCommonCollectionsArrayCollection {#2536
-elements: array:2 [
0 => array:2 [
"key" => 1
"type" => "somethingcreatesomething"
]
3 => array:2 [
"key" => 4
"type" => "alacreate"
]
]
}