Будут некоторые люди, которые порекомендуют вам сделать отдельные запросы и объединить набор результатов, потому что это сократит свертку сценария.
Будут другие люди, которые одобрят использование UNION ALL для объединения две таблицы запросов, потому что они предпочитают одну поездку в БД или тому подобное, вам не нужно добавлять псевдонимы столбцов после первого SELECT (для ситуаций, когда имена столбцов отличаются).
Я учту ваши запрашивать, но понимать, что есть несколько способов удовлетворить ваши требования.
В настоящее время CodeIgniter не предлагает метод UNION, поэтому лучшее (AFAIK), которое вы можете сделать с активной записью, - это скомпилировать два SELECT запрашивает и выполняет UNION внутри вызова query()
.
Фактически отображаемые запросы и наборы результатов могут незначительно отличаться в зависимости от адаптера базы данных - эта универсальность является функцией методов построения запросов CodeIgniter.
Я включаю дополнительный столбец (source
), чтобы вы могли принимать обоснованные решения (о гиперссылках и т. д. c.) при отображении данных. В противном случае вы можете ссылаться на значение id
, но не знаете, к какой таблице относится id
.
Код:
$this->db->select($this->db->escape('v_grants') . ' AS source, id, title, type');
$this->db->from('v_grants');
$this->db->like('title', $keyword);
$this->db->or_like('open_to', $keyword);
$vGrantsQuery = $this->db->get_compiled_select();
$this->db->select($this->db->escape('art') . ', id, title, type');
$this->db->from('art');
$this->db->like('title', $keyword);
$this->db->or_like('open_to', $keyword);
$artQuery = $this->db->get_compiled_select();
/*
var_export([
$this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result(),
$this->db->last_query()
]);
*/
return $this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result();
ps Метод result()
метода модели либо выдаст пустой массив или массив объектов. По вашему мнению, вам не нужно count()
; просто отметьте if (!$result) {
- это скажет вам, если набор результатов пуст.