2011-08-05 149 views
1

我有我保存組合標籤與教條的小問題。 我的投資組合模型:保存多對多的關係

abstract class BasePortfolio extends Doctrine_Record 
{ 
    public function setTableDefinition() 
    { 
     $this->setTableName('portfolio'); 
     $this->hasColumn('id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'fixed' => false, 
      'unsigned' => true, 
      'primary' => true, 
      'autoincrement' => true, 
      )); 
     $this->hasColumn('title_esp', 'string', 250, array(
      'type' => 'string', 
      'length' => 250, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('date_creation', 'date', null, array(
      'type' => 'date', 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 
    } 

    public function setUp() 
    { 
     parent::setUp(); 
     $this->hasMany('Images', array(
      'local' => 'id', 
      'foreign' => 'id_portfolio')); 

     $this->hasMany('PortfolioHasTags', array(
      'local' => 'id', 
      'foreign' => 'portfolio_id')); 
    } 
} 

類PortfolioHasTags:

abstract class BasePortfolioHasTags extends Doctrine_Record 
    { 
     public function setTableDefinition() 
     { 
      $this->setTableName('portfolio_has_tags'); 
      $this->hasColumn('portfolio_id', 'integer', 4, array(
       'type' => 'integer', 
       'length' => 4, 
       'fixed' => false, 
       'unsigned' => true, 
       'primary' => true, 
       'autoincrement' => false, 
       )); 
      $this->hasColumn('tags_id', 'integer', 4, array(
       'type' => 'integer', 
       'length' => 4, 
       'fixed' => false, 
       'unsigned' => false, 
       'primary' => true, 
       'autoincrement' => false, 
       )); 
     } 

     public function setUp() 
     { 
      parent::setUp(); 
      $this->hasOne('Portfolio', array(
       'local' => 'portfolio_id', 
       'foreign' => 'id')); 

      $this->hasOne('Tags', array(
       'local' => 'tags_id', 
       'foreign' => 'id')); 
     } 
} 

和標籤型號

abstract class BaseTags extends Doctrine_Record 
{ 
    public function setTableDefinition() 
    { 
     $this->setTableName('tags'); 
     $this->hasColumn('id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => true, 
      'autoincrement' => true, 
      )); 
     $this->hasColumn('title_esp', 'string', 45, array(
      'type' => 'string', 
      'length' => 45, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 
    } 

    public function setUp() 
    { 
     parent::setUp(); 
     $this->hasMany('PortfolioHasTags', array(
      'local' => 'id', 
      'foreign' => 'tags_id')); 
    } 
} 

我需要保存到一個投資組合的衆多標籤:

$portfolio = new Portfolio; 
foreach($tags as $id_tag) 
{ 
$portfolio->PortfolioHasTags[]->tags_id = $id_tag; 
} 

有更好的方法來做到這一點?使用手柄來保存這種關係很醜陋!

回答

0

我也在整理學說中的多對多關係。首先,我發現這個文檔頁面非常有幫助: Doctrine Join Table Associations: Many-to-many

在Doctrine中,您可以通過代碼中的「關聯類」(BasePortfolioHasTags)創建關係。相關類,BasePortfolio和BaseTags需要許多一對多的關係,在他們的設置表示()方法:

abstract class BasePortfolio extends Doctrine_Record 
{ 
    ... 

    public function setUp() 
    { 
     ... 

     $this->hasMany('BaseTags', array(
      'local' => 'id', 
      'foreign' => 'tags_id', 
      'refClass' => 'BasePortfolioHasTags')); 
    } 
} 

abstract class BaseTags extends Doctrine_Record 
{ 
    ... 

    public function setUp() 
    { 
     parent::setUp(); 
     $this->hasMany('BasePortfolio', array(
      'local' => 'id', 
      'foreign' => 'portfolio_id', 
      'refClass' => 'BasePortfolioHasTags')); 
    } 
} 

對我來說,這似乎有點起初混淆,但語法著作。 Doctrine使用BasePortfolio類的本地ID通過關係直接與BaseTags類的本地ID相關聯,而不是標準的一對多或一對一的將本地id與外部id關聯的語法在refClass,BasePortfolioHasTags的setUp()方法中設置。

一旦你得到這個設置,上面的文檔鏈接將告訴你如何保存數據。

我希望這會有所幫助。就像我說的,我也試圖破譯這些東西。

+0

我已經通過在模式中放入一個foreignAlias來解決它。 謝謝! – Mauro