Codeigniter объединяет запрос внутри цикла - PullRequest
1 голос
/ 07 мая 2019

У меня есть массив идентификаторов, и я получаю информацию об этих элементах из базы данных. Я создал цикл foreach, чтобы получить каждый элемент один за другим, а затем передать его в массив, прежде чем вернуться к контроллеру. Проблема заключается в том, что построитель запросов объединяет все идентификаторы в одном запросе.

public function get_product_by_ids($ids) {
        $products = array();
        foreach ($ids as $id) {
            $this->db->where('product_id', $id);
            $query = $this->db->get('products')->row_array();

            array_push($products, $query);
        }

    return $products;
}

Вот результат этого кода с использованием профилировщика.

Мои идентификаторы

Array
(
    [0] => 22
    [1] => 18
    [2] => 21
)

Произведенный запрос от профилировщика:

SELECT *
FROM `products`
WHERE `product_id` = '22'
AND `product_id` = '18'
AND `product_id` = '21'
AND `product_id` = '22' 

SELECT *
FROM `products`
WHERE `product_id` = '18' 

SELECT *
FROM `products`
WHERE `product_id` = '21' 

Выход: Первый пустой, потом второй до последнего.

Я попытался использовать where_in (), как для @danblack, и вот полученный запрос:

SELECT *
FROM `products`
WHERE `product_id` = '22'
AND `product_id` = '18'
AND `product_id` = '21'
AND `product_id` IN('22', '18', '21') 

Вот мои новые коды:

public function get_product_by_ids($ids) {
        $this->db->where_in('product_id', $ids);
        $query = $this->db->get('products')->result_array();

        return $query;
}

Вывод: пустой массив.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

попробуйте это,

public function get_product_by_ids($ids) {
      $this->db->select('*');
      $this->db->from('products');
      $this->db->where_in('product_id', $ids);//$ids should be array
      $query = $this->db->get();
      if ($query->num_rows() > 0) {
         return $query->result_array();
      }else{
         return array();
      }
}
0 голосов
/ 07 мая 2019

Я не знаю, если это проблема с CodeIgniter (на codeigniter 3.x) или я сделал что-то не так, но вот мое временное решение:

public function get_product_by_ids($ids) {
        $newquery = "SELECT * FROM products WHERE product_id IN(";

        $counter = 0;
        foreach ($ids as $id) {
            $newquery .= "'".$id."'";
            if($counter < (sizeof($ids) - 1)) {
                $newquery .= ", ";
            }
            $counter++;
        }

        $newquery .= ")";
        $query = $this->db->query($newquery)->result_array();

        return $query;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...