我为这个可怕的头衔道歉,我想不出如何解释我的问题。
在我的数据库中,我有以下表格,articles
,tags
和articles_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
标签的文章,该怎么办?
答案 0 :(得分:2)
对于此类情况,您可以使用LinkableBehavior。它专为您想要的结果而设计。如果您不想使用它,则必须对标记控制器进行查询:
$this->Tag->find('all', array('conditions' => array('Tag.name' => 'ruby')));
答案 1 :(得分:2)
试试这个
// 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
));
答案 2 :(得分:0)
不可能直接。
最简单的方法是通过标记控制器进行查询
答案 3 :(得分:0)
我用CakePHP 3.x的答案更新了这个问题。
您可以使用INNER JOIN查找给定this.mediaStream
的所有articles
。此连接的好处是它将文章保留为查询中的主表。当您通过HABTM加入对结果进行分页时,将此设置为一个简单的解决方案。
tag
第一个连接条件必须是数组键。如果使用$tag_id = 3; // the ID of the tag
$query = $this->Articles->find('all')
->innerJoin('articles_tags', [
'Articles.id = articles_tags.article_id',
'articles_tags.tag_id' => $tag_id
]);
数组赋值,则CakePHP会将=>
作为字符串参数传递给连接条件。哪个不行。
您还可以为多个HABTM条件堆叠articles_tags.article_id
。例如;查找标记以及类别的所有文章。您还可以使用innerJoin
查询表达式匹配多个标记。
您也可以像in
我确定此信息已在网络上发布,但此问题是谷歌搜索结果中的佼佼者。所以这可能会对其他人有所帮助。