我正在尝试建立一个搜索框,以便从2个表中找出相似的标题。
艺术桌-ID标题类型
拨款表-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>
有些人会建议您进行单独的查询并合并结果集,因为这将减少脚本卷积。
会有其他人赞成使用UNION ALL来合并两个表查询,因为他们更喜欢单次访问数据库,或者不需要在第一个SELECT之后为列加上别名(对于列名称不同)。
我将满足您的要求,但要理解,有多种方法可以满足您的要求。
CodeIgniter当前不提供UNION方法,因此对活动记录可以做的最好的(AFAIK)是编译两个SELECT查询并在query()
调用中执行UNION。
实际呈现的查询和结果集可能会略有不同,具体取决于您的数据库适配器-这种多功能性是CodeIgniter查询构建方法的功能。
我添加了一个附加列(source
),以便您在显示数据时可以做出明智的决定(关于超链接等)。否则,您可能会引用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.s。 Model方法的result()
将产生一个空数组或一个对象数组。在您的视图中,您不需要count()
;只需检查if (!$result) {
-这将告诉您结果集是否为空。