Yii返回所有带有常用标签的记录

时间:2016-08-02 15:49:30

标签: php yii tags

我正在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);
}

以前是否有人这样做过或知道如何做到这一点?

2 个答案:

答案 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,所以我不会把我刚读过的文章拉成相关的。谢谢你的帮助。