встроенная форма «многие ко многим ко многим» - PullRequest
3 голосов
/ 19 августа 2011

У меня есть три простые таблицы (раса, судья, спортсмен), где столбцы - это имя и имя.

Существуют две другие таблицы (race_judge и race_athlete), в которых я соединяю гонку со многими судьями и гонку со многими спортсменами в приложении внешнего интерфейса с помощью встроенной формы, как описано в Расширенные формы ; В этих двух таблицах есть несколько дополнительных полей (например, заметки судьи о гонке и номере гонки спортсмена), которые можно заполнить во встроенной форме.

Теперь я хочу создать встроенную форму для последней таблицы "race_judge_athlete", где каждый судья, участвующий в гонке, может отдать голос каждому спортсмену, участвующему в этой гонке, и я хотел бы заполнить цифры в одной форме.

Как бы я это сделал, используя формы доктрин Symfony +?

Обновление : когда я вставляю новую расу (через RaceForm), судьи и спортсмены автоматически добавляются в race_judge и race_athlete (если они выбраны из виджета выбора) благодаря связи в моделях Athlete и Judge, но это не происходит на race_judge_athlete.


Вот схема.имл:


Race:
  columns:
    name: string(255)
Athlete:
  columns:
    name: string(255)
  relations:
    RaceAthlete:
      foreignAlias: RaceAthlete
      class: Race
      refClass: RaceAthlete
      local: athlete_id
      foreign: race_id 
Judge:
  columns:
    name: string(255)
  relations:
    RaceJudge:
      foreignAlias: RaceJudge
      class: Race
      refClass: RaceJudge
      local: judge_id
      foreign: race_id

RaceJudge:
  columns:
    race_id: integer
    judge_id: integer
    judge_notes: string
  relations:
    Race:
      class: Race
      local: race_id
    Judge:
      class: Judge
      local: judge_id
RaceAthlete:
  columns:
    race_id: integer
    athlete_id: integer
    athlete_number: integer
  relations:
    Race:
      class: Race
      local: race_id
    Athlete:
      class: Athlete
      local: athlete_id

RaceJudgeAthlete:
  columns:
    race_id: integer
    judge_id: integer
    athlete_id: integer
    score: double
  relations:
    Race:
      class: Race
      local: race_id
    Judge:
      class: Judge
      local: judge_id
    Athlete:
      class: Athlete
      local: athlete_id

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Я собрал быстрый хак, который работает, но он так же уродлив, как и ад! Я все еще ищу чистую реализацию, но сейчас это подойдет.

В RaceForm.class.php я переопределяю функцию doSave следующим образом: Я получаю коллекции RaceJudge и RaceAthlete, только что сохраненные doSave в RaceForm, и вручную создаю отсутствующую коллекцию, удаляю фактическую коллекцию RaceJudgeAthlete и сохраняю созданную вручную коллекцию в очищенной коллекции RaceJudgeAthlete.

Вот код:



    protected function doSave($con = null)
    {
        $this->saveRaceJudgeList($con);
        $this->saveRaceAthleteList($con);

        parent::doSave($con);
        $this->saveRaceJudgeAthlete();
    }

    public function saveRaceJudgeAthlete()
    {
        $race = $this->getObject();
        $RaceJudgeAthlete_collection = new Doctrine_Collection('RaceJudgeAthlete');
        $i = 0;
        foreach ($race->RaceJudge as $judge)
        {
            foreach ($race->RaceAthlete as $athlete)
            {
                $RaceJudgeAthlete_collection[$i]->setRaceId($race->getId());
                $RaceJudgeAthlete_collection[$i]->setJudgeId($judge->judge_id);
                $RaceJudgeAthlete_collection[$i]->setAthleteId($athlete->athlete_id);

                $i++;
            }
        }

        $race->RaceJudgeAthlete->delete();
        $race->RaceJudgeAthlete = $RaceJudgeAthlete_collection;
        $race->RaceJudgeAthlete->save();
    }

0 голосов
/ 29 августа 2011

Вы пробовали это так? У меня похожий случай, и он работает для меня.

Race:
  columns:
  name: string(255)

Athlete:
  columns:
    name: string(255)
  relations:
    Races:
      class: Race
      refClass: RaceAthlete
      foreignAlias: RaceAthleteList
      local: athlete_id
      foreign: race_id 

Judge:
  columns:
    name: string(255)
  relations:
    Races:
      class: Race
      refClass: RaceJudge
      foreignAlias: RaceJudgeList
      local: judge_id
      foreign: race_id

RaceJudge:
  columns:
    race_id: integer
    judge_id: integer
    judge_notes: string
  relations:
    Race:
      class: Race
      local: race_id
    Judge:
      class: Judge
      local: judge_id

RaceAthlete:
  columns:
    race_id: integer
    athlete_id: integer
    athlete_number: integer
  relations:
    Race:
      class: Race
      local: race_id
    Athlete:
      class: Athlete
      local: athlete_id

RaceJudgeAthlete:
  columns:
    race_id: integer
    judge_id: integer
    athlete_id: integer
    score: double
  relations:
    Race:
      local: race_id
      foreign: id
    Judge:
      local: judge_id
      foreign: id
    Athlete:
      local: athlete_id
      foreign: id

НТН

...