【问题标题】:how do i search the data from two tables, they are not related我如何从两个表中搜索数据,它们不相关
【发布时间】:2020-04-07 05:55:33
【问题描述】:

我正在尝试构建一个搜索框以从 2 个表中找出相似的标题。

艺术桌- ID 标题 类型

赠款表- ID 标题 类型

现在我只能显示 grants 表中的数据,如果搜索类似于标题的内容,如何显示两个表的结果?

型号

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】:

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

还有其他人会赞同使用 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();

附言Model 方法的result() 将生成一个空数组或对象数组。在您的视图中,您不需要count();只需检查if (!$result) {——这会告诉你结果集是否为空。

【讨论】:

  • 谢谢! :) 这解决了我的问题。我有一个显示结果的问题,如何使用源列作为超链接?
  • 这在很大程度上取决于您的控制器是如何设置的以及您需要做什么,但通常,您执行的操作与您已经在视图中执行的操作相同。 &lt;?=$row-&gt;source?&gt; 访问源值。
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多