Доктрина / Symfony - множественные отношения один-ко-многим в одной модели - PullRequest
1 голос
/ 10 июня 2011

Вот выдержка из схемы, которую я на самом деле имею

Software:
  columns:
    title:
      type: string(255)
    id_publisher:
      type: integer
    id_developper:
      type: integer

Company:
  columns:
    name:
      type: string(255)
    nationality:
      type: string(255)

Как видите, моя модель программного обеспечения имеет две внешние ссылки: издатель и разработчик.Я хотел бы создать отношение один ко многим для каждой из этих двух ссылок.Проблема в том, что они обе компании.

Сначала я попробовал что-то вроде показанного ниже на моей модели программного обеспечения, но отношение работает только для первой локальной ссылки id_publisher.

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 учитываются только издателиоговорка.

Итак, наконец, мой вопрос заключается в том, как справиться с множественными отношениями «один ко многим» одной и той же модели?Спасибо за ваше время!

1 Ответ

3 голосов
/ 01 июля 2011

возможно, вам следует попытаться добавить чужой псевдоним, чтобы сообщить доктрине, с каким отношением иметь дело при выполнении запроса:

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.

Надеюсь, это поможет,

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

...