Как преобразовать SQL-запрос в запрос codeigniter - PullRequest
0 голосов
/ 21 ноября 2018

Может ли кто-нибудь помочь мне преобразовать этот Запрос Sql

SELECT *
FROM customer c
LEFT JOIN customer_order co 
ON c.customer_number = co.customer_number 
AND co.order_status IN ('preparing', 'prepared')
WHERE c.customer_status='unpaid'
AND c.order_status = 'unserve'
AND co.cus_ord_no IS null

в Запрос Codeigniter , как показано на рисунке ниже, например

enter image description here

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете сделать

public function view_customers()
{
    $sql = "SELECT * FROM customer c LEFT JOIN customer_order co ON c.customer_number = co.customer_number AND co.order_status IN ('preparing', 'prepared') WHERE c.customer_status='unpaid' AND c.order_status = 'unserve' AND co.cus_ord_no IS null";

    return $this->db->query($sql)->result();
}

Вы можете использовать row() для одного выхода до object или row_array(), если один выход, но array.result() кратно objects и result_array() кратно arrays.

Мой способ обычно такой:

Контроллер:

public function view()
{
    $this->load->model('My_Model');

   $data = new stdclass;
   $data->user_lists = $this->my_model->view_users(array('nationality'=>'AMERICAN'));
}

Модель:

public function view_users($param = null) //no value passed
{
   $condition = '1';
   if (!empty($param)) { //Having this will trap if you input an array or not
     foreach ($param as $key=>$val) {
       $condition .= " AND {$key}='{$val}'"; //Use double quote so the data $key and $val will be read.
     }
   }

   $sql = "SELECT * FROM users WHERE {$condition}"; //Use double quote so the data $condition will be read.
   // Final out is this "SELECT * FROM users WHERE 1 AND nationality='AMERICAN'";

   return $this->db->query($sql)->result();
}
0 голосов
/ 21 ноября 2018

Если в операторах запроса нет предложений, которые необходимо условно изменить, тогда можно использовать $this->db-query().

$sql = "SELECT * FROM customer c LEFT JOIN customer_order co 
ON c.customer_number=co.customer_number AND co.order_status IN ('preparing', 'prepared')
WHERE c.customer_status='unpaid' AND c.order_status='unserve' AND co.cus_ord_no IS null";

$query = $this->db->query($sql)->result();
echo json_encode($query);

Возможно, целесообразно включить проверку возврата из query()хотя, потому что если это не удастся (возвращает false), то вызов result() вызовет исключение.Один из способов, который может быть обработан, выглядит следующим образом.

$query = $this->db->query($sql);
if($query !== FALSE) 
{
    echo json_encode($query->result());
    return;
}

echo json_encode([]); // respond with an empty array

Query Builder (QB) - хороший инструмент, но он часто излишним.Это добавляет много накладных расходов для создания строки, которая буквально передается в $db->query().Если вы знаете строку и ее по какой-то причине не нужно реструктурировать, вам не нужен QB.

QB наиболее полезен, когда вы хотите внести изменения в оператор запроса условно.Сортировка может быть одним из возможных случаев.

if($order === 'desc'){
   $this->db->order_by('somefield','DESC'); 
} else {
       $this->db->order_by('somefield','ASC'); 
}

$results = $this->db
    ->where('other_field', "Foo")
    ->get('some_table')
    ->result();

Так что, если значение $order равно 'desc', оператор запроса будет

SELECT * FROM some_table WHERE other_field = 'Foo' ORDER BY somefield 'DESC' 

Но если вы настаиваете на использовании Query BuilderЯ считаю, что это ваш ответ

$query = $this->db
    ->join('customer_order co', "c.customer_number = co.customer_number AND co.order_status IN ('preparing', 'prepared')", 'left')
    ->where('c.customer_status','unpaid')
    ->where('c.order_status','unserve')
    ->where('co.cus_ord_no IS NULL')
    ->get('customer c');

//another variation on how to check that the query worked
$result = $query ? $query->result() : [];
echo json_encode($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...