Вот выдержка из схемы, которую я действительно имею
Software: columns: title: type: string(255) id_publisher: type: integer id_developper: type: integer Company: columns: name: type: string(255) nationality: type: string(255)
Как вы можете видеть, моя модель программного обеспечения имеет две внешние ссылки: издатель и разработчик. Мое желание хотело бы создать отношение один к многим для каждой из этих двух ссылок. Проблема в том, что это обе компании.
Сначала я попробовал что-то вроде приведенного ниже в моей модели программного обеспечения, но отношение работает только для первого локального ссылочного идентификатора_пользователя.
relations: Company: type: one foreignType: many local: [id_publisher, id_developper] foreign: id
Затем я попробовал это (всегда на модели программного обеспечения):
relations: Publisher: class: Company type: one foreignType: many local: id_publisher foreign: id Developper: class: Company type: one foreignType: many local: id_developper foreign: id
Но когда я выполняю запрос, который подсчитывает количество программ, связанных с компанией …
public function findAllQuery(Doctrine_Query $q = null) { $q = Doctrine_Query::create() ->select('c.*, COUNT(s.id) AS count_software') ->from('Company c') ->leftJoin('c.Software s') ->groupBy('c.id'); return $q; }
… в предложении COUNT учитываются только издатели.
Итак, наконец, мой вопрос: как бороться с множественными отношениями один-ко-многим одной модели? Спасибо за ваше время !
возможно, вам следует попытаться добавить иностранный псевдоним, чтобы рассказать доктрину, с которой приходится иметь дело при запуске вашего запроса:
relations: Publisher: class: Company type: one foreignType: many foreignAlias: PublishedSoftware local: id_publisher foreign: id Developer: class: Company type: one foreignType: many foreignAlias: DevelopedSoftware local: id_developer foreign: id
И в вашем запросе вы должны присоединиться к обоим отношениям и суммировать индивидуальные счета:
$q = Doctrine_Query::create() ->select('c.*, COUNT(ps.id)+COUNT(ds.id) AS count_software') ->from('Company c') ->leftJoin('c.PublishedSoftware ps') ->leftJoin('c.DevelopedSoftware ds') ->groupBy('c.id') ;
Доктриной по умолчанию является использование имени модели в качестве идентификатора для отношения, поэтому, если использовать более одного отношения к одной и той же модели, вы действительно должны переименовать хотя бы один, чтобы доктрина теперь стала то, что вы имеете в виду. Без этого вы не сможете просто получить сборник опубликованного программного обеспечения так:
$pubSoftware = $myCompany->getPublishedSoftware(); $devSoftware = $myCompany->getDevelopedSoftware();
Доктрина не способна (ИМХО) относиться к обоим отношениям к той же модели, что и одна. Поэтому звонок:
$allSoftware = $myCompany->getSoftware();
не будет извлекать все сопутствующее программное обеспечение на модели с несколькими отношениями, а только те, которые могут быть получены из отношения, называемого Software
.
Надеюсь, это поможет,
~~~ Приветствия.