2010-06-23 46 views
0

我試圖設置'Gabarits'之間的m2m關係。在同一張桌子上的多對多關係

  • 一個gabarit可以有很多Gabarits(稱爲選項)
  • 一個gabarit可以來自許多Gabarits(稱爲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

從邏輯上講,它會給我這樣的:對於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.fils_id WHERE gabarit.id IN (SELECT fils_id FROM gabarit2_gabarit WHERE gabarit_id = '507') ORDER BY gabarit.id ASC 

生成的SQL:

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

生成getOptions)SQL(

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'的主鍵?有'description'和'libelle'但沒有定義的主鍵。 – DrColossos 2010-06-23 12:37:04

+1

嗨,當省略主鍵時,教條自動生成它。 所以我Gabarit有一個ID BIGINT AUTO_INCREMENT(mysql) 我覺得問題不在這裏。 – Florian 2010-06-23 12:51:27

回答

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 2010-06-25 11:12:45

相關問題