2016-08-02 20 views
0

Ich schreibe ein Dokumentationszentrum in Yii. Ich habe alles abgesehen von einem Abschnitt, wo ich verwandte Artikel ziehen möchte. Hinweis: ich meine nicht relationale Datenbanken, rein, mit dem Begriff.Yii alle Datensätze mit gemeinsamen Tags zurückgeben

Also wenn ich in der Artikelansicht bin, möchte ich in der Lage sein, eine Tabelle unter dem Artikel, der andere Artikel mit einem gemeinsamen Tag auflistet. Jeder Datensatz in der Artikeldatenbank enthält eine Spalte mit durch Kommas getrennten Werten.

dh

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

Also muß ich meine Aufzeichnungen $model->tags in eine Funktion zu übergeben, die ein Modell mit nur Aufzeichnungen gibt, die den Tag enthält beispielsweise new

Hier ist, was ich bisher habe, obwohl ich Ich kann nicht einmal daran denken, wie ich das zum Laufen bringen kann.

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

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

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

Hat jemand dies schon einmal getan oder weiß, wie es geht?

Antwort

1

Ich nehme an, Ihre Tags Feld verwenden Zeichenfolge, jedes Tag durch Koma getrennt.

Sie können addCondition Methode in CDbCriteria verwenden. Als Suchkriterien, werde ich entweder für String , verwenden neue oder neue,

Hier ist ein Beispiel:

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

Aber es gibt ein kleines Problem mit diesem, wenn Ihr Tags Feld hat nur 1 Tag Wert wie 'neu', es wird nicht funktionieren. Dazu müssen Sie möglicherweise eine benutzerdefinierte Funktion in Ihrer Datenbank erstellen.

Hoffe diese Hilfe.

Edit:

Die Zeichenfolge in der Datenbank bleiben gleich, nichts zu ändern. Entschuldigung für das Missverständnis.

+0

Danke dafür, ich werde gehen und sehen, ob ich das zur Arbeit bekommen kann – gsusonline

+0

Sie sind willkommen, froh, wenn ich helfen kann –

+0

so gerade jetzt die Werte in meiner Tag-Spalte sind zB "neu, Test, fünf ", schlägst du vor, dass sie Strings sein müssen, dh" 'new', 'test', 'five' "? – gsusonline

0

Danke für die Antwort zmiftah, dauerte eine Weile, um es zu implementieren, aber Ihre Antwort war 90% dort. Das Problem mit der Antwort war die $ category-Variable enthält die Zeichenfolge "new, test, five", das Element, das in die sql-Wildcards eingeschlossen werden muss, muss das einzelne Array-Element sein.

Hier ist mein Code;

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); 
    } 

Dieser Code macht auch ein paar andere Dinge, wie aus der Rückkehr Modell die vorhandenen id entfernen, so ziehen Ich bin nicht der Artikel i als nahe stehende gerade gelesen habe. Danke für Ihre Hilfe.

+0

Sie sind willkommen, Entschuldigung für die späte Antwort –