2011-01-14 5 views
1

私はcodeigniter CXTagsタグ付けライブラリを使用するアプリケーションを持っています。次のようにPHP:アクティブレコードテーブル結合

データベース構造は以下の通りである:

ポスト

ID

がROW_ID tags_ref

テーブル

ID

safe_tag

タグ

私のクエリは基本的に$のsafe_tagがnullでない場合、その後post.id = tags_ref.row_idにtags_refに参加行く

タグをTAG_ID 、tags_ref.tag_id = tags.idのタグを結合します。ここで、tags_ref.table = 'posts'とtags.safe_tag = 'food'

残念ながら、私がアクティブレコードで作成したクエリは正しく機能していません。 £safe_tagがnullの場合はクエリが完璧に動作しますが、正しくない場合は間違った結果になります。ここで

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'); 
    ... 

のプロファイリングとクエリです:

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' 

は、誰かが見ていることはできますか?私はそれに目を新鮮にする必要があると思う。

+0

«残念ながら私は、アクティブレコードに書いたクエリが正しくfuctioningされていません»内でクエリを実行するのを忘れて - 任意のエラーや予期しないデータセットが返さ?実行前に$ this-> dbを使ってSQL-queryを文字列として表示(デバッグ)できますか? –

+0

私は、CI Active Recordクラスが非常に制限的であることを発見し、更新と挿入にのみ使用します。それ以外に$ db-> query( "SELECT * FROM table WHERE id =?"、array($ id))を使用してください。あなたのコードで追加の結合句のためにやっているように見えるように妥協する必要はありませんし、アクティブなレコードクエリを解析するためにサーバーに余分な負荷がかかることはありません。申し訳ありませんが、これは本当にあなたの質問に答えるものではなく、私の考えを分かち合いたいと思っています。 – Naatan

+0

ところで、プロファイリングをオンにすることで実行されたクエリを見ることができます(http://codeigniter.com/user_guide/general/profiling.html)。 – Naatan

答えて

1

あなたの実際にあなたの最初の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 
    }