Это на самом деле невозможно с этими отображениями. Вам не хватает хотя бы одного:
Проект также должен знать детали клиента.
Допустим, у вас есть идентификатор одного проекта, вы можете легко получить название компании, но просто нет способа найти строку, в которой указаны детали клиента, связанные с этим проектом.
Позвольте мне дать вам 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();
Приветствие.