1

PHPActiveRecord と CodeIgniter を使用しています。ブログ CMS を作成しようとしていますが、ブログには多くのカテゴリがあり、blogrefs という別のテーブルを参照しています。だから基本的に

blogs => blogrefs => blogcats

blogrefs は blogrefs.blog_id を通じてブログを参照しています

blogrefs は、blogrefs.blogcat_id を介して blogcats を参照しています

    function get_blogs($params = array()){

    $CI =& get_instance();

    $joins  = 'LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_id';
    $joins  .= 'LEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id';
    $category = (isset($params['category']))?$params['category']:'';
    $keyword = (isset($params['keyword']))?$params['keyword']:'';
    $status = (!isset($params['status']) || $params['status'] == '')?'':$params['status'];
    $order_by = (isset($params['order_by']))?$params['order_by']:'created_on';
    $direction = (isset($params['direction']))?$params['direction']:'DESC';
    $limit = (isset($params['limit']))?$params['limit']:'';
    $offset = (isset($params['offset']))?$params['offset']:'';
    $st = '';
    if($status == ''){
        $st = '!';
    }

        if(!empty($category))
        {
            $conditions = array(
                "((blogcats.id = ?) OR (blogcats.parent_id = ?))
                 AND blogs.status $st= ?
                 AND (blogs.title LIKE '%$keyword%' OR blogs.content LIKE '%$keyword%')",$category,$category,$status
            );

        }else{
            $conditions = array(
                "blogs.status $st= ?
                 AND (blogs.title LIKE '%$keyword%' OR blogs.content LIKE '%$keyword%')",$status
            );
        }

    $result = Blog::find('all',array(
        'include'       => array('blogcat','blogref','user'),
        'joins'         => $joins,
        'conditions'    => $conditions,
        'limit'         => $limit,
        'offset'        => $offset,
        'order'         => "$order_by $direction",
        'group'         => 'blogs.id'
    ));

    $count =  Blog::find('all',array(
        'conditions'    => $conditions
    ));

    $object = new stdClass;
    $object->posts = $result;
    $object->total = count($count);
    return $object;

}

私が使用する場合だけでなく、すべてが機能します

((blogcats.id = ?) OR (blogcats.parent_id = ?))

特定のカテゴリからブログを取得します。どんな答えでも大歓迎です。

4

2 に答える 2

0

エラーは、結合の最初の部分を定義する場所の最後にスペースがありません。

$joins  = 'LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_id';
$joins  .= 'LEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id';

次のように評価されます。

LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_idLEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id

'blog_idLEFT' という名前の列を探すことで最初の結合が台無しになり、2 番目の結合が外部左結合ではなく内部結合になることがわかります。

davedriesmans の提案に従うか、生成している最終的な mySQL クエリを出力する方法を見つけることをお勧めします。(または両方)

于 2013-03-28T23:06:53.877 に答える
0

これはあまり明確ではありません。モデルと CI の Active Record クラスを使用してみませんか? ( http://ellislab.com/codeigniter/user-guide/database/active_record.html )、

    $this->db->where('blogrefs.blogcat_id', $catid);
    $this->db->join('blogrefs', 'blogs.id = blogrefs.blog_id');
    ...
于 2013-03-28T21:22:00.517 に答える