2010-06-23 47 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

相关问题