Codeigniter combine where_in and like active record queries

12,588

Do you want to find all the friends? If there are only one id, then you don't need like part, as you already found your friend. On the other part, if you not sure about id of your friends, and just want to find all friends matching your like criteria, you may remove where_in part.

This will find your friends:

$this->db->select('id, email, first_name, last_name, current_location_state, current_location, avatar, avatar_fb');
$this->db->from('users');
$this->db->like('first_name', $search);
$this->db->or_like('last_name', $search);
$this->db->or_like("CONCAT(first_name, ' ', last_name)", $search);
$this->db->or_like('email', $search);

Considering there's only one id, such query will find only one friend:

$this->db->select('id, email, first_name, last_name, current_location_state, current_location, avatar, avatar_fb');
$this->db->from('users');
$this->db->where_in('id', $ids);

EDIT

Sometimes, with codeigniter, it is better to use a raw query:

$this->db->query('
  SELECT `id`, `email`, `first_name`, `last_name`, `current_location_state`, `current_location`, `avatar`, `avatar_fb`
  FROM `users`
  WHERE (
    `first_name` like ?
    or `last_name` like ? 
    or concat(`first_name`, ' ', `last_name`) like ? 
    or `email` like ?)
  AND `id` in('
    .join(',',
    array_map(function($e) { return (int) $e; }, $ids))
    .')',
  "%$search%", "%$search%", "%$search%", "$search")->result();
Share:
12,588
Daniel White
Author by

Daniel White

I began my professional career in 2006 as a greenhorn in the printing industry. My father owned a large shop in Fort Worth and under his wing I learned the hard side of running your own business, sales and relationship building. Building upon my graphic design career I began to master software engineering, scalable infrastructure, data visualization, smart contract development and more. In the last 10 years I've done everything from freelance development, to working with major brands to plan, design, develop and iterate on websites and applications from basic Wordpress websites to SAAS platforms, custom API solutions, blockchain dapps and even my latest passion, smart contracts.

Updated on June 05, 2022

Comments

  • Daniel White
    Daniel White almost 2 years

    I have the following active record query:

    $this->db->select('id, email, first_name, last_name, current_location_state, current_location, avatar, avatar_fb');
              $this->db->from('users');
              $this->db->like('first_name', $search);
              $this->db->or_like('last_name', $search);
              $this->db->or_like("CONCAT(first_name, ' ', last_name)", $search);
              $this->db->or_like('email', $search);
              $this->db->where_in('id', $ids);
    

    This is a function that has an array $ids, which has the ids of my friends. I want to search for friends that match my "like" queries, but only have one of the id's in the $ids variable.

    I'm pretty sure i need to combine where_in and all the like statements so its something like (WHERE_IN $ids && Like Statements).

    I'm not great at mysql so any help here would be appreciated.

    Thanks!

    function narrow_connections($search) {
    
           //First get all this users connections...
           $connections = $this->get_connections($this->session->userdata('user_id'), 0, 0);
    
           if(empty($connections)) {
              return array();
           }else {
    
              //Need to get an array of id's
              $ids = array();
              foreach($connections as $con) {
                 array_push($ids, $con['id']);
              }
    
              //Now that we have an array of ID's, find all users that have one of the ids (our connections), AND match a search term to narrow down
              //the results. 
    
              $this->db->select('id, email, first_name, last_name, current_location_state, current_location, avatar, avatar_fb');
              $this->db->from('users');
              $this->db->like('first_name', $search);
              $this->db->or_like('last_name', $search);
              $this->db->or_like("CONCAT(first_name, ' ', last_name)", $search);
              $this->db->or_like('email', $search);
              $this->db->where_in('id', $ids);
              $query = $this->db->get();
              $data = array();
    
              foreach ($query->result() as $row) {
              $data[] = array(
                'id' => $row->id,
                'email' => $row->email,
                'first_name' => $row->first_name,
                'last_name' => $row->last_name,
                'current_location_state' => $row->current_location_state,
                'current_location' => $row->current_location,
                'avatar' => $row->avatar,
                'avatar_fb' => $row->avatar_fb,
              );
              }
              return $data;
    
           }
         }