2010-06-23 2 views
0

Я пытаюсь установить отношение m2m между 'Gabarits'.Отношение многих ко многим к одной таблице

  • Один габарита может иметь много габаритам (называемые Options)
  • Один габарита может исходить от многих габаритам (называется OptionsFrom)

Вот мой schema.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#relationships:join-table-associations:self-referencing-nest-relations:non-equal-nest-relations

Логически, это дало бы мне это:

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 :: getOptio nsFrom возвращает пустую коллекцию?

заранее, Флориан.

+0

Вам не хватает первичного ключа 'Gabarit'? Есть 'описание' и' libelle', но не определенный первичный ключ. – DrColossos

+1

Привет, когда омфинирует первичный ключ, доктрина генерирует его автоматически. Итак, у моего Gabarit есть идентификатор BIGINT AUTO_INCREMENT (mysql) Я думаю, что проблема не здесь. – Florian

ответ

1

Это, скорее всего, будет тот факт, что вы используете один и тот же псевдоним

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 

Это могло бы помочь?

+0

Удивительный !!!! Оно работает ! :) Большое спасибо, даже если это кажется логикой сейчас, я думаю, что я бы об этом не думал ... Спасибо! Флориан. – Florian

Смежные вопросы