как мне искать данные из двух таблиц, они не связаны - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь построить окно поиска, чтобы найти похожий заголовок из 2 таблиц.

Art Table-id Тип заголовка

Grants Table-id Тип заголовка

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

Модель

function searchResult($keyword)
{
  $this->db->like('title',$keyword);
  $this->db->or_like('open_to',$keyword);
$this->db->from('v_grants');
$query  =   $this->db->get();
  return $query->result();
}

Контроллер

function searchResult() {
    $keyword    =   $this->input->post('keyword');
    $data['results']    =   $this->products_model->searchResult($keyword);
    $this->load->view('searchresults.php', $data);
}

Вид

<form class="form-inline my-2 my-md-0" action="<?php echo site_url('starter/searchResult');?>" method 
= "post">
  <input class="form-control" type="text" name = "keyword"/>

<br>
<table>
<?php if (count($results) > 0){
foreach($results as $row){ ?>

<table class="table">
<tr>
    <td><h2><a href="<?=  base_url()?>product/grantindividual/<?=$row->id?>"><?php echo $row->title?> 
</h2></a>  


</tr>

<?php   
}
}
else { ?>

<br>
<br>


<h1> No results found. </h1>

<?php 
}

?>

</table>

1 Ответ

1 голос
/ 07 апреля 2020

Будут некоторые люди, которые порекомендуют вам сделать отдельные запросы и объединить набор результатов, потому что это сократит свертку сценария.

Будут другие люди, которые одобрят использование 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) { - это скажет вам, если набор результатов пуст.

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