2017-08-26 70 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