我有一张桌子上有文章。文章可以有一个或多个标签。我想基于他们的标签检索类似的文章。
我的表结构非常简单。它基本上只是文章和标签之间的多对多关系
abstract class BaseArticle extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('article');
$this->hasColumn('id', 'integer', 8, array(
'type' => 'integer',
'length' => 8,
'primary' => true,
'autoincrement' => true,
));
$this->hasColumn('title', 'string', null, array(
'type' => 'string'
));
}
public function setUp()
{
$this->hasMany('Articletag', array(
'local' => 'id',
'foreign' => 'article_id',
'cascade'=>array('delete')));
$this->hasMany('Dbtag as Dbtags', array('refClass'=>'Articletag',
'local' => 'article_id',
'foreign'=>'tag_id'
)
);
}
}
abstract class BaseDbtag extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('dbtag');
$this->hasColumn('id', 'integer', 4, array(
'type' => 'integer',
'length' => 4,
'fixed' => false,
'unsigned' => false,
'primary' => true,
'autoincrement' => true,
));
$this->hasColumn('name', 'string', 255, array(
'type' => 'string',
'length' => 255,
'fixed' => false,
'unsigned' => false,
'primary' => false,
'notnull' => false,
'autoincrement' => false,
));
}
public function setUp()
{
parent::setUp();
$this->hasMany('Articletag', array(
'local' => 'id',
'foreign' => 'tag_id'));
}
}
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();
$this->hasOne('Article', array(
'local' => 'article_id',
'foreign' => 'id'));
$this->hasOne('Dbtag', array(
'local' => 'tag_id',
'foreign' => 'id'));
}
}
我需要的是根据标签集检索类似的文章。我希望得到10篇按匹配标签排序的文章。
在本机SQL here中解决了类似的问题(使用电影而不是文章)。
在不使用本机SQL的情况下使用Doctrine_Query在Doctrine中执行此操作的最佳方法是什么?