Отношение многих ко многим на одном столе - PullRequest
0 голосов
/ 23 июня 2010

Я пытаюсь установить отношение m2m между 'Gabarits'.

  • В одном габарите может быть много габаритов (называемых опциями)
  • В одном габарите может быть много габаритов (называемых опциями)

Вот моя схема.yml:

Gabarit:
  actAs: [Attachable]
  columns:
    libelle: { type: string, size: 255 }
    description: { type: clob }
  relations:
    Options:
      class: Gabarit
      refClass: Gabarit2Gabarit
      local: gabarit_id
      foreign: fils_id
      foreignAlias: OptionsFrom

Gabarit2Gabarit:
  columns:
    fils_id: { type: integer, primary: true }
    gabarit_id: { type: integer, primary: true }
  relations:
    Gabarit:
      class: Gabarit
      local: gabarit_id
      alias: Gabarit
      foreignAlias: Gabarit2Gabarits
    Fils:
      class: Gabarit
      local: fils_id
      alias: Fils
      foreignAlias: Gabarit2Gabarits

Сгенерированный код:

   $this->hasMany('Gabarit as Options', array(
         'refClass' => 'Gabarit2Gabarit',
         'local' => 'gabarit_id',
         'foreign' => 'fils_id'));

    $this->hasMany('Gabarit as OptionsFrom', array(
         'refClass' => 'Gabarit2Gabarit',
         'local' => 'fils_id',
         'foreign' => 'gabarit_id'));

Кажется хорошим, согласно http://www.doctrine -project.org / projects / orm / 1.2 / docs / manual/ defining-models / en # отношения: объединения таблиц-связей: самореферентные-гнезда-отношения: неравные-гнезда-отношения

Логически, это даст мне следующее:

foreach($gabarit_>getOptions() as $option)
{
    in_array($gabarit->getId(), $options->getOptionsFrom()->getPrimaryKeys()); // should be true but returns false !!
}

Сгенерированный SQL для getOptions ():

SELECT gabarit.id AS gabarit__id, gabarit.libelle AS gabarit__libelle, gabarit.description AS gabarit__description, gabarit2_gabarit.fils_id AS gabarit2_gabarit__fils_id, gabarit2_gabarit.gabarit_id AS gabarit2_gabarit__gabarit_id FROM gabarit INNER JOIN gabarit2_gabarit ON gabarit.id = gabarit2_gabarit.fils_id WHERE gabarit.id IN (SELECT fils_id FROM gabarit2_gabarit WHERE gabarit_id = '507') ORDER BY gabarit.id ASC

Сгенерированный SQL для getOptionsFrom ():

SELECT gabarit.id AS gabarit__id, gabarit.libelle AS gabarit__libelle, gabarit.description AS gabarit__description, gabarit2_gabarit.fils_id AS gabarit2_gabarit__fils_id, gabarit2_gabarit.gabarit_id AS gabarit2_gabarit__gabarit_id FROM gabarit INNER JOIN gabarit2_gabarit ON gabarit.id = gabarit2_gabarit.gabarit_id WHERE gabarit.id IN (SELECT gabarit_id FROM gabarit2_gabarit WHERE fils_id = '529') ORDER BY gabarit.id ASC

У вас есть идея, почему Gabarit :: getOptionsFrom возвращаетпустая коллекция?

заранее спасибо, Флориан.

1 Ответ

1 голос
/ 24 июня 2010

Вероятнее всего, вы используете тот же псевдоним

foreignAlias: Gabarit2Gabarits

Ваш Gabarit2Gabarit должен выглядеть следующим образом:

Gabarit2Gabarit:
  columns:
    fils_id: { type: integer, primary: true }
    gabarit_id: { type: integer, primary: true }
  relations:
    Gabarit:
      class: Gabarit
      local: gabarit_id
      alias: Gabarit
      foreignAlias: Gabarit2GabaritsGabarit
    Fils:
      class: Gabarit
      local: fils_id
      alias: Fils
      foreignAlias: Gabarit2GabaritsFils

Это можетпомочь?

...