2016-08-02 3 views
0

私はYiiにドキュメントセンターを書いています。私はそれをすべて1つのセクションから離れて作業しています。ここで関連する記事を取りたいと思っています。注:私はリレーショナルデータベースとして、純粋に、用語を使用して関連することを意味しません。Yiiは共通のタグですべてのレコードを返します

私は記事のビューにいるとき、共通のタグを持つ他の記事をリストした記事の下の表をプルできるようにしたいと思います。記事データベースの各レコードには、カンマで区切られた値の列があります。

id | title | tags 
1 | new | new,article,text 
2 | new2 | new,alternate 
3 | new3 | new,test,text 

すなわち

だから私は、例えば、タグnew

は、ここで私はかかわらず、私がこれまで持っているものだ含まれているレコードだけでモデルを出力する関数に私の記録$model->tagsを渡す必要がありますこれをどのように機能させるのか考えることさえできません。

public function getRelatedArticles($category) { 
    $search_array = explode(",", $category) 
    $criteria = new CDbCriteria(); 

    $criteria->compare('tags', $category); 

    return DocsArticles::model()->findAll($criteria); 
} 

どのようにこれを行う前にこれをやったことがあるのか​​知っていますか?

答えて

1

タグフィールドは文字列を使用しており、各タグは昏睡で区切られていると仮定します。

addConditionメソッドをCDbCriteriaに使用できます。

public function getRelatedArticles($category) { 
    $criteria = new CDbCriteria(); 
    $criteria->addCondition("tags LIKE '%,{$category}%' OR tags LIKE '%{$category},%'"); 
    return DocsArticles::model()->findAll($criteria); 
} 

しかし、あなたのタグ場合はこれで少し問題がある:検索基準については、私はどちらかの文字列に使用する、または新規新しい、ここで

は一例ですフィールドには 'new'のように1つのタグ値しかありません。このためには、データベースにユーザー定義関数を作成する必要があります。

このヘルプが必要です。

編集:

データベース内の文字列はそのまま残り、変更することはありません。誤解して申し訳ありません。

+0

これをお寄せいただきありがとうございます。これが動作するかどうかを確認してください。 – gsusonline

+0

お手数ですが –

+0

私のタグ欄の値は "new、test、five "、"新しい "、"テスト "、" 5 "などの文字列にする必要があると提案していますか? – gsusonline

0

回答をいただきありがとうございます。実装に時間がかかりましたが、回答は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を削除するように他のもののカップルをやっているので、私はちょうど、関連として読んだ記事を引っ張っていませんよ。ご協力いただきありがとうございます。

+0

あなたは歓迎されています。 –

関連する問題