CodeIgniter 使用 like() 和 or_like() 进行活动记录查询

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

问题是它显示数据库中的所有行,而不是仅显示包含搜索关键字的那些行。

public function search($data)
{

    $name = $data["name"];
    $surname = $data["surname"];

    $this->db->select('*');
    $this->db->from('workers');
    $this->db->like('name', '%' . $name . '%');
    $this->db->or_like('surname', '%' . $surname . '%');

    $query = $this->db->get();
php codeigniter activerecord sql-like query-builder
2个回答
7
投票

你以错误的方式编写了类似于查询的 CI。查看文档如何正确编写它

您的查询应该是这样的。无需添加

%
。如果您不传递类似函数的第三个参数,则 CI 添加它们。

$this->db->select('*');
$this->db->from('workers');
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);

$query = $this->db->get();

最好使用一些像这样的有效数据。

$this->db->select('*');
$this->db->from('workers');
if($name)
{
   $this->db->or_like('name', $name);
}
if($surname)
{
    $this->db->or_like('surname', $surname);
}
$query = $this->db->get();

1
投票

Shaiful 是正确的,您的 like 语句写得不正确,但我想扩展这一点,您必须小心 Active Record 中的

or_
子句。在 Codeigniter 中,这些不使用括号,因此以下内容很好:

$this->db->select('*');
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);
$query = $this->db->get('workers');

它产生:

SELECT * FROM `workers` WHERE `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`;

但是,如果您稍后扩展查询,则以下内容将无法正常工作:

$this->db->select('*');
$this->db->where('id', $id);
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);
$query = $this->db->get('workers');

这会产生:

SELECT * FROM `workers` WHERE `id`=`$id` AND `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`;

第二个示例的问题在于,由于 SQL 中后面的

WHERE
,因此
OR
子句变为可选。

Codeigniter 3 引入了使用括号的功能,如果以后您的查询有可能变得更加复杂,我建议您使用以下方法。

因此,我认为使用

or_
子句时更安全的方法是:

$query = $this->db->select('*')->from('workers')
        ->group_start()
                ->like('name', $name)
                ->or_like('surname', $surname)
        ->group_end()
->get();

在您当前的示例中,Shaiful 提供的内容没有任何问题,并且它完全兼容 Codeigniter 2。

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