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

aut*_*tix 4 php doctrine join doctrine-orm

我有一个具有成员和(具有列和)的实体Log(表)。该可例如(有关订单的行为,如状态更改)或(对于相关操作)。与“资源”实体/表之间没有关系(在Doctrine中或数据库中都没有)。logresourceTyperesourceIdresource_logresource_idresourceTypeOrderWhateverWhateverLog

现在,我只选择Log与关联OrdermyOrderProperty = "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%'
Run Code Online (Sandbox Code Playgroud)

但是代码

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

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

[Semantical Error] line 0, col 102 near 'o WHERE o.myOrderProperty': Error: Class MyNamespace\Log has no association named order
Run Code Online (Sandbox Code Playgroud)

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

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

aut*_*tix 5

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);
Run Code Online (Sandbox Code Playgroud)

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