Accessor отношения переопределения доктрины - PullRequest
0 голосов
/ 21 мая 2011

Скажем, у вас есть следующие отношения (изменены для простоты):

Dog:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true }

AwardType:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true }

Award:
  columns:
    dog_id:     { type: integer, notnull: true, primary: true }
    award_id:   { type: integer, notnull: true, primary: true }
    is_granted: { type: boolean, notnull: true, default: false }
  relations:
    Dog:
      local:        dog_id
      foreign:      id
      type:         one
      foreignType:  many
      foreignAlias: Awards
    AwardType:
      local:        award_id
      foreign:      id
      type:         one
      foreignType:  many
      foreignAlias: Awards

С помощью описанной выше настройки я могу добавить новую собаку и вручную добавить награды этой собаке. Я также могу редактировать награды, уже предоставленные собаке.

Когда я вызываю $ myDog-> getAwards (), я хочу, чтобы в набор были включены все предоставленные награды (Award.is_granted == true && Award.dog_id == $ myDog () -> getId ()), чтобы слить все награды, которые имеют этой собаке еще не было предоставлено.

Есть ли опция, которую можно установить в модели где-нибудь, чтобы это произошло? Если нет, то как лучше всего это сделать?

Я использую Symfony 1.4 и ORM от Doctrine 1.2.

[Редактировать 1]
Я понимаю, что не объяснил всю эту награду должным образом, поэтому я попытаюсь остановиться на этом. Допустим, у вас есть следующие типы наград:

  • 1: Кость для не приставшего почтальона
  • 2: ошейник, чтобы не кусать мисс Молли
  • 3: Большая кость для погони за молочником (которого мы все знаем, это зло)

Dog1 уже зарегистрирован и получил AwardTypes 1 и 3. При редактировании этого Dog форма должна отображать AwardTypes 1 и 3 с установленным флажком, а AwardType 2 - без установленного флажка. Это прекрасно работает, если у собаки 1 есть одна запись в таблице наград для каждого из типов призов. Два с is_granted == true и один is_granted == false. Пока все хорошо.

Когда пользователь вводит новую Собаку, форма должна отображать все типы AwardTypes, но без отмеченных флажков. При сохранении новой собаки в таблице «Награды» должно появиться всего 3 строки с установленным флагом is_granted в соответствии с состоянием флажков.

Я знаю, что могу получить все AwardTypes и проверить, что против AwardTypes собака уже была предоставлена ​​(показывая все непроверенные для новых собак, предоставленные проверенные + еще не предоставленные непроверенными для существующих собак). Здесь я спрашиваю, есть ли в Doctrine какая-то магия, которая даст мне сложные наборы, как описано выше.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Хорошо, у вас есть проблемы с моделированием ваших данных. Вероятно, это должно выглядеть так:

Dog:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true, unique: true }
  relations:
    Awards:
      class: Award
      foreignType: many
      type: many
      refClass: DogAward
      local: dog_id
      foreign: award_id

Award:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true, unique: true }

DogAward:
  columns:
    dog_id:     { type: integer, notnull: true, primary: true }
    award_id:   { type: integer, notnull: true, primary: true }

Я использовал отношения «многие ко многим» и добавил некоторые ограничения, которые, на мой взгляд, могут быть полезны в вашем случае. Symfony должен создать форму, похожую на ту, которую вы хотите, сообщите нам, если это не так.

0 голосов
/ 21 мая 2011

Вы можете переписать метод getAwards() метод в lib / model / Dog.class.php

например

public function getAwards(){
  return $query = $this->getTable()
    ->createQuery('a')
    ->where('a.dog_id = ?', $this->getId())
    ->addWhere('a.is_granted = ?', true);
    ->execute();
}

Обратите внимание, это всего лишь макет, я не проверял его прямо сейчас

...