Я пытаюсь построить запрос, используя Doctrine, но немного борюсь с отношениями DQL и ManyToMany.
У меня есть субъект Бизнес, Клиент, Менеджер и Здание.
Каждый Бизнес связан с Бизнесом, может иметь много Менеджеров, и каждый Менеджер связан с Клиентом.
Кроме того, каждый Бизнес связан с Клиентами, имеющими отношения ManyToMany.
Вот схема, которая может помочь понять отношения:
Я хотел бы создать запрос, в котором перечислены все клиенты, связанные с бизнесом, с присоединениями от бизнеса к клиентам, но которые не связаны напрямую с бизнесом-клиентом во взаимоотношениях ManyToMany.
Смысл этого запроса в том, что я хочу перечислить клиентов, связанных с бизнесом, в выборке, и пользователь выбирает, какого клиента он хочет добавить в бизнес, поэтому он создает запись в отношении ManyToMany между бизнесом и Клиент. Я хочу скрыть клиентов, уже добавленных в Бизнес, чтобы кто-то не мог несколько раз добавить Клиента в Бизнес.
Вот что я хотел бы сделать с помощью SQL:
SELECT * FROM client c
INNER JOIN manager m ON c.id = m.client_id
INNER JOIN building_manager bm ON m.id = bm.manager_id
INNER JOIN building b ON bm.building_id = b.id
INNER JOIN business bs ON b.id = bs.building_id
LEFT JOIN business_client bc ON bs.id = bc.business_id
WHERE bs.id = ?
AND bc.business_id IS NULL;
Используя Doctrine, я пытался добиться аналогичного результата, используя это в моем файле ClientRepository:
public function findByBuilding($id) {
return $this->createQueryBuilder('c')
->innerJoin('App\Entity\Manager', 'm', 'WITH', 'c.id = m.client')
->join('m.buildings', 'b')
->leftJoin('c.businesses','bs')
->andWhere('b.id = :val')
->andWhere('bs.id IS NULL')
->setParameter('val', $id)
->getQuery()
->getResult();
}
Кажется, что это строка ->andWhere('bs.id IS NULL')
, потому что она понимается как WHERE business.id IS NULL
, и я хотел бы что-то вроде WHERE business_client.business_id IS NULL