我如何从两个表中搜索数据,它们不相关

问题描述 投票:1回答:1

我正在尝试建立一个搜索框,以便从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>
php codeigniter search
1个回答
1
投票

有些人会建议您进行单独的查询并合并结果集,因为这将减少脚本卷积。

会有其他人赞成使用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) {-这将告诉您结果集是否为空。

© www.soinside.com 2019 - 2024. All rights reserved.