在 CodeIgniter 中一起使用 %like% 和 JOIN

问题描述 投票:0回答:3

我有三个表:“users”、“products”和“product_types”。 “users”表存储有关我的网站用户的所有常用数据(包括

id
列); “产品”表列出了产品的
product_id
、添加该产品的用户的
user_id
以及
product_type
; “product_types”表有一个
id
列(与“products”表中的
product_type
int 值相对应)和一个 varchar
name
列。

我想在“用户”表中执行

%like%
搜索,以便当用户搜索产品类型时,它会显示拥有与搜索的产品类型匹配的产品的所有用户。 这是我目前在 CodeIgniter 模型中使用的内容:

$string = urldecode($string);
$this->db->select('users.*');
$this->db->from('users');
$this->db->like('users.company_name',$string,'both');
$this->db->or_like('users.address_1',$string,'both');
$this->db->or_like('users.city',$string,'both');
$this->db->or_like('users.contact',$string,'both');
$this->db->or_like('product_types.name',$string,'both');
$this->db->join('products','users.id = products.client_id');
$this->db->join('product_types','products.product_type = product_types.id');
$this->db->distinct();
$users = $this->db->get();
foreach($users->result() as $user){
   // search result
}

然后我将其输入 foreach 语句...但大多数时候它只显示第一行 - 其他时候它返回没有结果。 谁能告诉我哪里错了?

php codeigniter join search sql-like
3个回答
3
投票

我不明白你为什么要进行多个查询,它只能在一个查询中完成

    SELECT a.*,b.*,C.* FROM users a LEFT JOIN products b ON b.user_id = a.id LEFT JOIN product_types c ON b.product_type = c.id WHERE a.company_name LIKE '%$string%' OR a.address_1 LIKE '%$string%' OR a.city LIKE '%$string%' a.contact LIKE '%$string%' b.name LIKE '%$string%' 

这将为您提供具有该产品类型的用户的所有产品,尝试在您的数据库上运行它以查看其实际情况。然后使用 foreach 语句来获取结果


1
投票

我调试查询的方法是首先从顶级查询开始,然后查看结果。然后我在其中附加一条语句并再次查看结果。

因此,对于您的情况,您可以从简单的情况开始:

$this->db->select('users.*');
$this->db->from('users');

查看结果,然后添加另一条语句:

$this->db->select('users.*');
$this->db->from('users');
$this->db->like('users.company_name',$string,'both');

执行此操作,直到最终形成整个查询。

重点是,在此过程中,您会发现哪个语句正在过滤您的其他预期结果。这也可以向后完成。


0
投票

对于搜索产品名称中的关键字并返回与该产品相关的用户的查询,可以丢弃大部分最初发布的查询。 搜索产品名称时,同时在

address1
city
contact
列中搜索是没有意义的。

您可以在

u.id
上使用 GROUP by 并编写 HAVING 子句,或返回不同的行。 如果用户拥有多个合格产品,您将看到同一用户的多个实例。

如果您的原始脚本在

foreach()
之后最多返回 1 行,那么您的数组构建脚本中可能存在错误 - 也许您在每次迭代时覆盖结果变量,而不是将数据推入其中。

    return $this->db
        ->distinct()
        ->select('p.id product_id, pt.name product_name, u.*')
        ->from('products p')
        ->join('users u', 'p.client_id = u.id')
        ->join('product_types pt','p.product_type = pt.id');
        ->like('pt.name', $string)
        ->get()
        ->result();

此脚本将返回零个或多个对象的数组。

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