如何在教义中没有关系的情况下加入?



我有一个实体Log(表log),其成员为resourceTyperesourceId(具有列resource_logresource_id列)。resourceType可以例如Order(针对订单的操作,例如状态更改)或Whatever(针对Whatever相关操作)。Log和"资源"实体/表之间没有关系(无论是在教义中还是在数据库中)。

现在我只想选择与Orders相关的LogsmyOrderProperty = "someValue"。这意味着:

SELECT
*
FROM
`log`
JOIN
`order` ON `order`.`id` = `log`.`resource_id` AND `log`.`resource_type` = 'order'
WHERE
`order`.`my_order_property` LIKE '%my_order_property_value%'

但是代码

$queryBuilder = $this->entityManager->createQueryBuilder();
$queryBuilder->select('l')->from(Log::class, 'l');
$queryBuilder->join('l.order', 'o');
...
$queryBuilder
->where('o.myOrderProperty = :myOrderProperty')
->setParameter('myOrderProperty', $myOrderProperty);

不起作用,因为实体LogOrder没有任何关系(尽管它具有属性order):

[Semantical Error] line 0, col 102 near 'o WHERE o.myOrderProperty': Error: Class MyNamespaceLog has no association named order

如何在没有两个实体之间定义关系的情况下JOIN

我知道,我可以使用继承。但从语义上讲,这不是继承案例。那么有没有另一种解决问题的方法呢?

没有关系的JOIN可以像这样实现:

$queryBuilder = $this->entityManager->createQueryBuilder();
$queryBuilder->select('l')->from(Log::class, 'l');
$queryBuilder->join(
Order::class,
'o',
DoctrineORMQueryExprJoin::WITH,
'o.id = l.resourceId'
);
...
$queryBuilder
->where('o.myOrderProperty = :myOrderProperty')
->setParameter('myOrderProperty', $myOrderProperty);

唯一的问题是,联接的实体不会添加到主实体中,因此$myLog->getOrder(...)返回null

相关内容

  • 没有找到相关文章

最新更新