2017-08-26 90 views
1

我有一个实体Log(表log)与会员resourceTyperesourceId(与列resource_logresource_id)。 resourceType可以例如Order(用于对订单进行的操作,例如状态更改)或Whatever(对于Whatever相关操作)。 Log与“资源”实体/表之间没有关系(无论在学说还是在数据库中)。如何加入没有在学说中的关系?

现在我只想选择Log s,这是Order s与myOrderProperty = "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); 

不起作用,因为实体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。但从语义上讲,这不是一个继承案例。那么解决这个问题还有另一种方法吗?

回答

1

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