php - 如何在没有 Doctrine 关系的情况下加入?

标签 php join doctrine-orm doctrine

我有一个实体 Log(表 log),其成员为 resourceTyperesourceId(列为 resource_logresource_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);

不起作用,因为实体 LogOrder 没有任何关系(尽管它具有属性 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/

相关文章:

php - Symfony 2 Doctrine MS SQL 错误

symfony - 什么是 PersistentCollection?

添加第六个变量时,PHP 变量在定界文档中不起作用

Mysql多表连接特例

php - 通过fsockopen和socket_get_status的Asterisk AMI PHP。 socket_get_status比其早返回未读字节

php - 如何在加入mysql sql中的表之前加上条件?

php - 如何在三重内连接表中显示适当的数据?

php - Doctrine 2 具体表继承与关联

php - 错误的月份(二月)- DateTime::createFromFormat

javascript - 将 jQuery 代码添加到 PHP 字符串