Как объединить отношения «многие ко многим» в Учении? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть несколько сущностей:

Поставщик:

/**
 * @ORM\Entity(repositoryClass="Blah\Blah\ApiClientBundle\Entity\SupplierRepository")
 */
class Supplier
{
    [...]

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Blah\SopBundle\Entity\SupplierUser", mappedBy="suppliers")
     */
    protected $users;

    [...]
}

SupplierUser:

/**
 * @ORM\Entity(repositoryClass="SupplierUserRepository")
 */
class SupplierUser
{
    [...]

        /**
         * @var ArrayCollection
         *
         * @ORM\ManyToMany(targetEntity="\Blah\Blah\ApiClientBundle\Entity\Supplier", inversedBy="users", cascade={"persist"})
         * @ORM\JoinTable(name="supplier_user_supplier",
         *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id", onDelete="CASCADE")},
         *      inverseJoinColumns={@ORM\JoinColumn(name="supplier_id", referencedColumnName="supplier_id")}
         * )
         * @Assert\Valid()
         */
        protected $suppliers;

    [...]
}

Теперь в одном репозитории я объединяю объекты, упомянутые выше, в один отчет (rpr):

public function findBrandsBySupplierUser(SupplierUser $supplierUser)
{
    return array_column(
        $this
            ->createQueryBuilder('rpr')
            ->join(Supplier::class, 's', 'WITH', 's.supplierId = rpr.supplierId')
            ->join(SupplierUser::class, 'su')
            ->where('su = :supplierUser')
            ->setParameters([
                'supplierUser' => $supplierUser,
            ])
            ->select('rpr.brand')
            ->distinct()
            ->orderBy('rpr.brand')
            ->getQuery()
            ->getArrayResult(),
        'brand'
    );
}

Но результат:

SELECT DISTINCT r0_.brand AS brand_0 FROM returnable_products_report r0_ 
INNER JOIN supplier s1_ ON (s1_.supplier_id = r0_.supplier_id)
INNER JOIN supplier_user s2_
WHERE s2_.user_id = ?
ORDER BY r0_.brand ASC

Итак, я получаю декартово соединение. Почему Doctrine не включается автоматически?

Я мог бы выбрать принудительное заполнение полей соединения, но я не знаю, как именно это сделать. Как должна выглядеть join(SupplierUser::class, 'su') в таком случае?

1 Ответ

0 голосов
/ 06 июля 2018

Рабочий ответ выглядит так:

->join('s.users', 'su')

вместо

->join(SupplierUser::class, 'su')
...