2011-01-14 5 views
1

Ich habe eine App, die die Coderegister CXTags Tagging-Bibliothek verwendet.PHP: Aktive Datensatztabelle verbindet

Die Datenbankstruktur ist wie folgt:

Beiträge

ID

tags_ref

row_id

Tabelle

tag_id

Tags

id

safe_tag

Tag

Meine Frage geht im Grunde, wenn $ safe_tag nicht null ist dann tags_ref beitreten auf post.id = tags_ref.row_id , trage tags Tags auf tag_ref.tag_id = tags.id ein, wo tags_ref.table = 'posts' und tags.safe_tag = 'essen'

SELECT * FROM posts 
JOIN tags_ref ON posts.id = tags_ref.row_id 
JOIN tags ON tags_ref.tag_id = tags.id 
WHERE tags.safe_tag = $safe_id 

Leider funktioniert die Abfrage, die ich im aktiven Datensatz geschrieben habe, nicht richtig. Die Abfrage funktioniert einwandfrei, wenn £ safe_tag null ist, aber wenn es nicht ist, bekomme ich falsche Ergebnisse. Hier

function get_posts($id = NULL, $safe_tag = NULL) { 

    if($safe_tag != NULL){ 
     echo $safe_tag;//debugging 
     $table = 'posts'; 
     $this->db->join('tags_ref', 'posts.id = tags_ref.row_id'); 
     $this->db->join('tags', 'tags_ref.tag_id = tags.id'); 
     $this->db->where('tags_ref.table', $table); 
     $this->db->where('tags.safe_tag',$safe_tag); 
    } 

    //if an id was supplied 
    if ($id != NULL) { 
     $this->db->where('posts.city_id',$id); 
    } 

    // execute query 
    $query = $this->db->get('posts'); 
    ... 

ist die Abfrage mit einer Profilierung auf:

SELECT * 
FROM (`posts`) 
INNER JOIN `tags_ref` ON `posts`.`id` = `tags_ref`.`row_id` 
INNER JOIN `tags` ON `tags_ref`.`tag_id` = `tags`.`id` 
WHERE `tags_ref`.`table` = 'posts' 
AND `tags`.`safe_tag` = 'food' 
AND `posts`.`city_id` = '2' 

Kann jemand einen Blick? Ich denke, ich brauche neue Augen darauf.

+0

zuerst zu laufen «Leider ist die Abfrage, die ich in aktiver Datensatz geschrieben habe, ist nicht fuctioning richtig» - Fehler oder unerwartete Datenmenge zurückgegeben? Können Sie die SQL-Abfrage vor der Ausführung als String mit Ihrer $ this-> db sehen (debuggen)? –

+0

Ich finde die CI Active Record Klasse sehr restriktiv und verwende sie nur für Updates und Einfügungen. Darüber hinaus verwenden Sie $ db-> query ("SELECT * FROM Tabelle WHERE id =?", Array ($ id)). Sie müssten nicht Kompromisse eingehen, wie Sie es für die zusätzliche Join-Klausel in Ihrem Code zu tun scheinen, und Sie würden keine zusätzliche Belastung auf dem Server für die Analyse Ihrer aktiven Datensatzabfrage verursachen. Tut mir leid, ich weiß, das beantwortet deine Frage nicht wirklich, wollte nur meine Gedanken teilen. – Naatan

+0

Übrigens können Sie die ausgeführten Abfragen sehen, indem Sie Profiling aktivieren (http://codeigniter.com/user_guide/general/profiling.html). – Naatan

Antwort

1

Ihr vergessen hat, um tatsächlich die Abfrage in Ihrem if{}

if($safe_tag != NULL){ 
     echo $safe_tag;//debugging 
     $table = 'posts'; 
     $this->db->join('tags_ref', 'posts.id = tags_ref.row_id'); 
     $this->db->join('tags', 'tags_ref.tag_id = tags.id'); 
     $this->db->where('tags_ref.table', $table); 
     $this->db->where('tags.safe_tag',$safe_tag); 
     $this->db->get(); // here 
    }