我正在Yii写一个文档中心。我把这一切都分开了一个部分,我想拉相关的文章。注意:我并不是指相关的关系数据库,纯粹是使用术语。
因此,当我在文章视图中时,我希望能够在文章下方拉出一个表格,该文章列出了具有共同标签的其他文章。文章数据库中的每个记录都有一个以逗号分隔值的列。
即
id | title | tags
1 | new | new,article,text
2 | new2 | new,alternate
3 | new3 | new,test,text
所以我需要将我的记录$model->tags
传递给一个函数,该函数输出的模型只包含例如标记new
这是我到目前为止所拥有的,但我甚至无法想到如何让它发挥作用;
public function getRelatedArticles($category) {
$search_array = explode(",", $category)
$criteria = new CDbCriteria();
$criteria->compare('tags', $category);
return DocsArticles::model()->findAll($criteria);
}
以前是否有人这样做过或知道如何做到这一点?
答案 0 :(得分:1)
我假设你的标签字段使用字符串,每个标记用逗号分隔。
您可以在 CDbCriteria 中使用 addCondition 方法。至于搜索条件,我将使用字符串,新或 new,
以下是一个例子:
public function getRelatedArticles($category) {
$criteria = new CDbCriteria();
$criteria->addCondition("tags LIKE '%,{$category}%' OR tags LIKE '%{$category},%'");
return DocsArticles::model()->findAll($criteria);
}
但是这有一点问题,如果您的标记字段只有1个标记值,例如'new',它将无效。为此,您可能需要在数据库中创建用户定义的函数。
希望得到这个帮助。
编辑:
数据库中的字符串保持不变,无需更改。很抱歉误会。
答案 1 :(得分:0)
感谢zmiftah的回答,花了我一段时间来实现它,但你的回答是90%。答案的问题是$ category变量包含字符串“new,test,five”,需要包装在sql通配符中的项需要是单个数组项。
这是我的代码;
public function getRelatedArticles($category,$id) {
$array = explode(',',$category);
$tagItems = null;
foreach($array as $tag){
$tagItems[0] = "id !={$id} AND (tags LIKE '%{$tag}%'";
$tagItems[] = "OR tags LIKE '%{$tag}%'";
}
$arrayReturn = implode(" ",$tagItems);
$criteria = new CDbCriteria();
$criteria->addCondition($arrayReturn . ")");
return DocsArticles::model()->findAll($criteria);
}
这段代码还做了其他一些事情,比如从返回的模型中删除现有的id,所以我不会把我刚读过的文章拉成相关的。谢谢你的帮助。