Запрос доктрины: лучший подход к созданию запроса выбора, объединяющего три таблицы? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть три таблицы, к которым мне нужно присоединиться, чтобы извлечь набор результатов, и я не уверен, стоит ли мне использовать createQueryBuilder, createNativeQuery или какой-то другой подход.

Мои три таблицы

  • Электронная почта (присоединяется к участнику через поле: member)
  • Участник (присоединяется к компании через поле: current_company)
  • Company

Объектыправильно аннотирован в коде.Например, в объекте электронной почты:

   /**
     * @ORM\ManyToOne(targetEntity="Member")
     * @ORM\JoinColumn(name="member", referencedColumnName="id", nullable=true)
     */
    protected $member;

В объекте участника:

/**
 * @ORM\ManyToOne(targetEntity="Company")
 * @ORM\JoinColumn(name="current_company", referencedColumnName="id", nullable=true)
 */
protected $current_company;

И в объекте компании:

/**
 * @ORM\ManyToMany(targetEntity="Member", mappedBy="companies")
 */
protected $members;

Что мне нужно сделатьэто извлечение набора записей из электронной почты, где все участники связаны с одной компанией.

Следующий SQL в MySQL возвращает то, что мне нужно, но я новичок в Doctrine и не знаю, как лучше всего перевести этот запросв что-то, что Doctrine может использовать для извлечения тех же результатов:

select e.* from email e
join member m on m.id = e.member
join company c on c.id = m.current_company
where m.current_company = '95f1b5a4-03c9-11e9-85b1-989096db2d5f';

Может ли кто-нибудь помочь, и какой подход следует использовать createQueryBuilder, createNativeQuery и т. д.?

1 Ответ

0 голосов
/ 20 декабря 2018

Обновление, я смог заставить его работать, используя старый добрый SQL, но я не уверен, является ли это приемлемым обходным путем в мире Доктрины.Мысли и предложения от тех, кто имеет больше опыта, будет очень приветствоваться!

$conn = $this->em->getConnection(); 
$sql = "select e.* from fitchek.email e join fitchek.member m on m.id = e.member join fitchek.company c on c.id = m.current_company where m.current_company = ?"; 

$stmt = $conn->prepare($sql); 
$stmt->bindValue(1, $company_uuid); 
$stmt->execute(); 
...