Codeigniter using LIKE with WHERE in SQL query

In codeigniter, I have a request like this:

    $this->db->select('*', false);
    $this->db->from('video as v');
    $this->db->where('v.start_date <=', 'NOW()', false);
    $this->db->like('v.title', $keywords);
    $this->db->or_like('v.title_tw', $keywords);
    $this->db->or_like('v.title_cn', $keywords);
    $query = $this->db->get();
    return $query->result_array();

      

Pending:

start_date <= NOW **AND** title like $keywords OR title_tw like $keywords OR title_cn like $keywords

      

However, this turns out to be:

start_date <= NOW **OR** title like $keywords OR title_tw like $keywords OR title_cn like $keywords

      

How to fix it? Many thanks.

Update:

Actual request:

function search_video($keywords) {
    $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
    $this->db->from('video as v');
    $this->db->join('teacher as t', 'v.teacher_id = t.id');
    $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
    $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
    $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
    $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
    $this->db->where('v.is_delete', false);
    $this->db->where('v.start_date <=', 'NOW()', false);
    $this->db->like('v.title', $keywords);
    $this->db->or_like('v.title_tw', $keywords);
    $this->db->or_like('v.title_cn', $keywords);
    $this->db->or_like('vt.tag', $keywords);
    $this->db->group_by('v.id');
    $query = $this->db->get();
    return $query->result_array();
}

      

+3


source to share


3 answers


For CodeIgniter 3.x:

You can use Grouping Queries to use parentheses in your query:

    $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
        $this->db->from('video as v');
        $this->db->join('teacher as t', 'v.teacher_id = t.id');
        $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
        $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
        $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
        $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
        $this->db->where('v.is_delete', false);
        $this->db->where('v.start_date <=', 'NOW()', false);
        $this->db->group_start();
        $this->db->like('v.title', $keywords);
        $this->db->or_like('v.title_tw', $keywords);
        $this->db->or_like('v.title_cn', $keywords);
        $this->db->or_like('vt.tag', $keywords);
        $this->db->group_end();
        $this->db->group_by('v.id');
        $query = $this->db->get();

      



For CodeIgniter 2.x:

until I tested it, I just thought this should work:

$this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
    $this->db->from('video as v');
    $this->db->join('teacher as t', 'v.teacher_id = t.id');
    $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
    $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
    $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
    $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
    $this->db->where('v.is_delete', false);
    $this->db->where('v.start_date <=', 'NOW()', false);
    $this->db->where("( v.title LIKE '%{$keywords}%'", null, FALSE);
    $this->db->or_like('v.title_tw', $keywords);
    $this->db->or_like('v.title_cn', $keywords);
    $this->db->where("OR vt.tag LIKE '%{$keywords}%' )", null, FALSE);
    $this->db->group_by('v.id');

      

+4


source


You can try this:



$sql = SELECT * FROM video as v where v.start_date <= NOW() AND (v.title like ? OR v.title_tw like ? or v.title_cn like ?);
$query = $this->db->query($sql, array($keywords, $keywords, $keywords));

      

+1


source


Finally, I create a request like this, it seems to work fine:

function search_video($keywords) {
    $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
    $this->db->from('video as v');
    $this->db->join('teacher as t', 'v.teacher_id = t.id');
    $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
    $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
    $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
    $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
    $this->db->where("(v.is_delete = false AND v.start_date <= NOW()) AND (v.title LIKE '$keywords' OR  v.title_tw LIKE '$keywords' OR v.title_cn LIKE '$keywords' OR vt.tag LIKE '$keywords')");
    $this->db->group_by('v.id');
    $query = $this->db->get();
    return $query->result_array();
}

      

Many thanks for the help.

0


source







All Articles