Doctrine Query Builder: объединение одного и того же класса сущностей в нескольких полях - PullRequest
0 голосов
/ 06 июня 2018

У меня есть объект с именем 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, который кажется "грязным".Есть ли другой способ сделать такое объединение?

...