У меня есть несколько сущностей:
Поставщик:
/**
* @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')
в таком случае?