Объединение нескольких таблиц в Doctrine2 - PullRequest
1 голос
/ 28 марта 2012

У меня есть следующий сценарий:

project -----> company <----- clientdetails

У меня есть три таблицы: project, clientdetails и company.

Ниже приведены отношения между ними:

project относится к company (через companyid).
clientdetails относится к company (через companyid).

project name хранится в таблице project.
company name хранится в таблице company.
client name хранится в clientdetails таблице.

Как я могу извлечь project name из таблицы project вместе с client name, хранящимися в таблице clientdetails и company name из таблицы company для соответствующего project, используя доктрину 2?

1 Ответ

1 голос
/ 24 мая 2012

Это на самом деле невозможно с этими отображениями. Вам не хватает хотя бы одного: Проект также должен знать детали клиента.

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

Позвольте мне дать вам SQL SELECT, который поможет мне объяснить:

SELECT p.name, c.name, cd.name FROM project p, company c, clientdetails cd WHERE p.id = GIVEN_ID AND p.companyid = c.id AND cd.companyid = c.id

Итак, в этом запросе вы бы заменили GIVEN_ID идентификатором вашего проекта. Теперь будет легко найти название компании, так как это простое объединение на companyid, но давайте посмотрим на другое объединение:

cd.companyid = c.id

Это выглядит просто, но на самом деле любые детали клиента, сопоставленные с идентификатором этой компании, будут успешными, и поэтому нет абсолютно никакой гарантии (и не так много), что вы получите правильное имя клиента. Так как будет более одного совпадения (если у вас есть более одного клиента, сопоставленного с этой компанией), он возьмет первое найденное совпадение и вернет имя этого клиента. Это означает, что у вас всегда будет одинаковое имя клиента.

Но, если вы добавите отображение ManyToOne из Project в Clientdetails, вы сможете заменить cd.companyid = c.id на cd.id = p.clientdetailsid, и это вернет правильные имена.

Вы также заметите, что этот вид запроса будет бесполезен, когда вы используете doctrine2, поскольку вы легко это сделаете так:

$projectId = 1; //this is an example
$project = App_Entities_Project::find($projectId);
$projectName = $project->getName();
$companyName = $project->getCompany()->getName();
$clientdetailsName = $project->getClient()->getName();

Приветствие.

...