У меня есть объект с именем Path
, который связан с другим объектом Product
с использованием двух разных полей.
/**
* @ORM\Entity
*/
class Path
{
/**
* @ORM\ManyToOne(targetEntity="Product")
*/
private $product;
/**
* @ORM\ManyToMany(targetEntity="Product")
*/
private $products;
}
Ссылки в разных полях выполняются из-за необходимости выполнения некоторой логики для«основной» продукт, позволяя подключать несколько продуктов в некоторых других частях приложения.
РЕДАКТИРОВАТЬ: Продукт в поле product
отсутствует в поле products
.
I 'Я собираюсь создать запрос, который будет выполнять некоторые другие проверки для Product
, возможно, объединяясь с другими объектами, связанными с Product
.Я бы хотел, чтобы база данных выполняла только одно объединение с таблицей продуктов (как если бы это не было сделано в Doctrine).
В настоящее время у меня настроено QueryBuilder
следующим образом:
$qb->leftJoin("path.products", 'path_product');
$qb->join(Product::class, 'products', 'WITH', "path.product = products OR path_product.id = products.id")
Сгенерированный SQL:
SELECT path.id AS id_0
FROM path path
LEFT JOIN path_product path_product ON path.id = path_product.path_id
LEFT JOIN product product_1 ON product_1.id = path_product.product_id
LEFT JOIN product product_2 ON (path.product_id = product_2.id OR product_1.id = product_2.id)
(Это упрощенный SQL, сгенерированный из Doctrine Query Builder с удаленными ненужными полями и расширенными псевдонимами)
... но это генерирует еще один дополнительныйприсоединиться к столу Product
, который кажется "грязным".Есть ли другой способ сделать такое объединение?