2010-04-13 5 views
3

Если есть таблица «Статья» и таблица «Теги». Статьи могут иметь несколько тегов и тегов, которые могут висеть на нескольких статьях.Как определить отношение n-m в доктрине?

Класс BaseArticle выглядит следующим образом:

abstract class BaseArticle extends Doctrine_Record { 
public function setTableDefinition() { 
    $this->setTableName('article'); 
    $this->hasColumn('article_id', 'integer', 8, array(
      'type' => 'integer', 
      'length' => 8, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => true, 
      'autoincrement' => true, 
    )); 
    $this->hasColumn('title', 'string', null, array(
      'type' => 'string', 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
    )); 
    $this->hasColumn('text', 'string', null, array(
      'type' => 'string', 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
    $this->hasColumn('url', 'string', 255, array(
      'type' => 'string', 
      'length' => 255, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
    )); 
} 

public function setUp() { 
    parent::setUp(); 
    $this->hasMany('Tag as Tags', array('local' => 'article_id', 
      'foreign'=>'tag_id', 
      'refClass'=>'Articletag') 
    ); 
} 

}

BaseTag-класс, как это:

abstract class BaseTag extends Doctrine_Record { 
public function setTableDefinition() { 
    $this->setTableName('tag'); 
    $this->hasColumn('tag_id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => true, 
      'autoincrement' => true, 
    )); 
    $this->hasColumn('name', 'string', null, array(
      'type' => 'string', 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
    )); 
} 

public function setUp() { 
    parent::setUp(); 
    $this->hasMany('Article as Articles', array('local' => 'tag_id', 
      'foreign'=>'article_id', 
      'refClass'=>'Articletag') 
    ); 
} 

}

А класс отношений, как это:

abstract class BaseArticletag extends Doctrine_Record 
{ 
    public function setTableDefinition() 
    { 
     $this->setTableName('articletag'); 
     $this->hasColumn('article_id', 'integer', 8, array(
      'type' => 'integer', 
      'length' => 8, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => true, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('tag_id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'fixed' => false, 
      'unsigned' => false, 
      'primary' => true, 
      'autoincrement' => false, 
      )); 
    } 

    public function setUp() 
    { 
     parent::setUp(); 
    } 
} 

При попытке получить свойство из статьи все идет хорошо, используя:

 $article = Doctrine_Query::create()->from('Article a') 
          ->where('id = ?' , 1) 
          ->fetchOne(); 
     echo $article->title; //gives me the title 

Но когда я пытаюсь это:

 foreach($article->Tags as $tag) { 
      echo($tag->name) 
     } 

Я получаю сообщение об ошибке:

Unknown record property/related component "Tags" on "Article" 
+0

после прочтения документации и перебора многочисленных примеров. Я все еще не могу найти проблему. Может ли быть, что n-m отношения нарушены в Доктрине 1.2.1? – murze

+0

Многие из многих отношений не нарушаются, я использую их ежедневно. Используя код, который я предоставил в своем ответе, должен работать ... О, кстати, работает ли это, если вы замените «article_id» и «tag_id» на простой «id» в вызове hasColumn()? – DuoSRX

ответ

3

Для настройки отношений «многие-ко-многим» вы должны поместить отношения в связанные таблицы, а не в таблицу соединений, например: (упрощенный)

Article 
... 
    Relations: 
    Tags: 
     class: Tag 
     local: article_id 
     foreign: tag_id 
     refClass: ArticleTag 

Tag 
... 
    Relations: 
    Articles: 
     class: Article 
     local: tag_id 
     foreign: article_id 
     refClass: ArticleTag 

ArticleTag: 
(no relations) 

Тогда вы сможете делать такие вещи, как $ article-> Tags. Дополнительная информация в Doctrine Documentation.

+0

Если я не понимаю его правильно, я думаю, что я применил свои ограничения в связанных таблицах (статья и тег), а не в совместном (ArticleTag) – murze

+0

. Когда речь идет о n: m, это правильный способ сделать это. – DuoSRX

0

Оказалось, что с Доктриной или с моим определением отношения не было ничего плохого. Причиной проблемы было то, что в проекте уже был класс с именем «Tag». После переименования этого класса отношения доктрины работали очень хорошо :-)

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