我有一个实体 Log
(表 log
),其成员为 resourceType
和 resourceId
(列为 resource_log
和 resource_id
)。 resourceType
可以例如Order
(用于订单操作,例如状态更改)或 Whatever
(用于 Whatever
相关操作)。 Log
和“资源”实体/表之间没有关系(无论是在 Doctrine 中,还是在数据库中)。
现在我只想选择与 Order
相关且 myOrderProperty = "someValue"
的 Log
。这意味着:
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);
不起作用,因为实体 Log
与 Order
没有任何关系(尽管它具有属性 order
) :
[Semantical Error] line 0, col 102 near 'o WHERE o.myOrderProperty': Error: Class MyNamespace\Log has no association named order
如何在两个实体之间没有定义关系的情况下JOIN
?
我知道,我可以使用 inheritance .但从语义上讲,这不是继承案例。那么有没有其他方法可以解决这个问题呢?
最佳答案
没有关系的JOIN
可以这样实现:
$queryBuilder = $this->entityManager->createQueryBuilder();
$queryBuilder->select('l')->from(Log::class, 'l');
$queryBuilder->join(
Order::class,
'o',
\Doctrine\ORM\Query\Expr\Join::WITH,
'o.id = l.resourceId'
);
...
$queryBuilder
->where('o.myOrderProperty = :myOrderProperty')
->setParameter('myOrderProperty', $myOrderProperty);
唯一的问题是,加入的实体没有添加到主实体中,因此 $myLog->getOrder(...)
返回 null
。
关于php - 如何在没有 Doctrine 关系的情况下加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45900627/