Codeigniter объединяет запросы where_in и подобные активные записи

У меня есть следующий запрос активной записи:

$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);

Это функция с массивом $ids, в котором есть идентификаторы моих друзей. Я хочу найти друзей, которые соответствуют моим запросам «Нравится», но имеют только один идентификатор в переменной $ids.

Я почти уверен, что мне нужно объединить where_in и все подобные операторы, чтобы это было что-то вроде (WHERE_IN $ids && Like Statements).

Я не очень хорошо разбираюсь в MySQL, поэтому любая помощь здесь будет оценена по достоинству.

Спасибо!

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;

       }
     }

person Daniel White    schedule 28.01.2014    source источник
comment
В codeigniter проще написать такой запрос, используя старый, сырой sql, а не active record   -  person baldrs    schedule 28.01.2014


Ответы (2)


Хочешь найти всех друзей? Если id только один, то like часть вам не нужна, так как вы уже нашли своего друга. С другой стороны, если вы не уверены в id ваших друзьях и просто хотите найти всех друзей, соответствующих вашим критериям, вы можете удалить where_in часть.

Это найдет ваших друзей:

$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);

Учитывая, что id всего один, такой запрос найдет только одного друга:

$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);

ИЗМЕНИТЬ

Иногда с codeigniter лучше использовать необработанный запрос:

$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();
person baldrs    schedule 28.01.2014
comment
Простите, я должен был указать, что мы пытаемся сузить список наших друзей по именам в этой функции. Итак, у нас есть таблица связей с нашими друзьями. Таким образом, мы получаем идентификаторы наших друзей в $ids. Затем мы пытаемся сказать, что все пользователи с идентификаторами наших друзей сужаются по поисковому запросу. Я напишу больше выше. - person Daniel White; 28.01.2014
comment
@DanielWhite, а в чем тогда проблема? Ваш код кажется правильным. Что он делает неправильно? - person baldrs; 28.01.2014
comment
в основном он получает идентификаторы моих подключений просто отлично, но операторы $this-›db-›like заменяют where_in и просто возвращают всех пользователей, которые соответствуют подобным утверждениям. Я хочу вернуть всех пользователей, которые соответствуют подобным утверждениям и являются одним из моих соединений. Итак (где_в $ids И (подобные операторы)). Я просто не могу понять, как написать для него запись SQL/Active. - person Daniel White; 29.01.2014

Прошло некоторое время, но у меня была та же проблема, и я решил ее, просто переупорядочив фильтры. Это означает: сначала вам нужно выполнить условие «где» (а не «где_в»)

Это будет выглядеть так:

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

      $this->db->where('id', $ids);
      $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);
person m.b    schedule 18.03.2016