带有“hasAndBelongsToMany"控制器的 CakePHP 条件查询
我为这个可怕的标题道歉,我想不出如何解释我的问题.
I apologize for the horrible title, I couldn't think of how to explain my problem.
在我的数据库中,我有以下表格:articles
、tags
和 articles_tags
.一篇文章可以有多个标签.
In my database I have the following tables, articles
, tags
, and articles_tags
. An article can have many tags.
目前我能够抓取所有带有所有标签的文章,但我希望能够根据它的标签找到文章.
Currently I am able to grab all the articles, with all the tags, but I want to be able to find articles based upon it's tags.
我的选择很简单:
$articles = $this->Article->find('all', array(
// extra condition to check for tag, maybe?
'conditions' => array('Article.status' => 'active'),
'limit' => $this->articles_per_page,
'offset' => ($page_num-1)*$this->articles_per_page
));
我从数据库返回如下:
Array
(
[0] => Array
(
[Article] => Array
(
[id] => 1
)
[Tag] => Array
(
[0] => Array
(
[id] => 1
[name] => Ruby
[slug] => ruby
[uses] => 1
[ArticlesTag] => Array
(
[id] => 1
[article_id] => 1
[tag_id] => 1
)
)
)
)
如果我只想返回带有 Ruby
标签的文章怎么办?
What do I do if I only want to return the articles with a Ruby
tag?
推荐答案
试试这个
// In your Article model
function getArticleByTagSql($tag)
{
$dbo = $this->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('DISTINCT(ArticlesTag.article_id)'),
'table' => "articles_tags",
'joins' => array(
array('table' => 'tags',
'alias' => 'Tag',
'type' => 'INNER',
'conditions' => array('ArticlesTag.tag_id = Tag.id')
)
),
'alias'=>"ArticlesTag",
'conditions' => array("Tag.name"=>Sanitize::clean($tag_words)),
'order' => null,
'group' => "ArticlesTag.article_id"
),
$this
);
$subQuery = ' Article.id IN (' . $subQuery . ')';
return $dbo->expression($subQuery);
}
// In your Articles Controller
$this->paginate['conditions'][] = $this->Article->getArticleByTagSql($tag_name);
$this->paginate['conditions'][] = array('Article.status' => 'active');
$this->paginate['limit'] = $this->articles_per_page;
// or as per your example
$articles = $this->Article->find('all', array(
// extra condition to check for tag, maybe?
'conditions' => array('Article.status' => 'active',$this->Article->getArticleByTagSql($tag_name)),
'limit' => $this->articles_per_page,
'offset' => ($page_num-1)*$this->articles_per_page
));
相关文章