使用 CodeIgniter 的查询生成器方法的条件 WHERE 条件和分组 OR LIKE 条件

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

我正在尝试使用多个“LIKE”条件来查找多个列中的匹配项。

我的PHP:

$area = $this->session->userdata('area');
if ($area == 'inbox') { 
    $this->db->where('receiver', $user); 
    $this->db->where('receiver_deleted !=', 'yes');         
} elseif ($area == 'sent') {
    $this->db->where('sender', $user); 
    $this->db->where('sender_deleted !=', 'yes');
}

$this->db->like('sender',$k);
$this->db->or_like('msg',$k); 
                
$this->db->from('messages');
$this->db->join('users', 'users.username = messages.sender', 'inner');
                
$this->db->order_by('read', 'no');
$sql = $this->db->get();
                    
if ($sql->num_rows > 0) {
    return $sql->result();
} else {
    echo "failed!";
}

我也尝试过:

$this->db->like('sender', $k); 
$this->db->like('msg', $k); 

在第一个中,什么也没有发生。在第二个中,仅执行一个,在本例中是第一个 LIKE。我无法让两者同时工作。

php codeigniter sql-like query-builder logical-grouping
6个回答
8
投票

为此,您应该使用带有 where 子句的分组。

$area = $this->session->userdata('area');
if($area == 'inbox'){

   $this->db->where('receiver',$user); 
   $this->db->where('receiver_deleted !=','yes');

   }elseif($area == 'sent'){
   $this->db->where('sender',$user); 
   $this->db->where('sender_deleted !=','yes');
}
$this->db->group_start();  //group start
$this->db->like('sender',$k);
$this->db->or_like('msg',$k); 
$this->db->group_end();  //group ed

3
投票

or_like
将在两个点之间产生一个 OR。您可以将一个数组传递给
like
以放置多个数组,并在它们之间使用 AND。

你尝试过这样做吗:

$this->db->like(array('sender' => $k, 'msg' => $k));

3
投票

这将搜索多列,中间有

OR

$this->db->or_like(array('sender' => $k, 'msg' => $k));/* LIKE OR LIKE */

2
投票

使用这个:

$this->db->or_like('location',$this->input->post('searchtext'));
$this->db->or_like('title',$this->input->post('searchtext'));

你会得到你想要的。


0
投票
  • 使用
    group_start()
    group_end()
    来封装您的条件逻辑。
  • where()
    like()
    方法可以接收关联数组以减少方法调用。
  • 使用方法链来实现最大程度的优雅。
  • 调用您的模型并传入所有必需的参数(无论它们来自哪里),因为模型方法应该只接收来自参数的数据(以获得最大的实用性和可测试性)。

控制器:

$result['messages'] = $this->YourModel->getMessages(
    $this->currentUserId,
    $this->input->get('keyword'),
    $this->session->userdata('area')
);

型号:

public function getMessages(
    int $user,
    string $search,
    ?string $area = null
): array {
    switch ($area) {
        case 'inbox': 
            $this->db->where([
                'receiver' => $user,
                'receiver_deleted !=' => 'yes',
            ]);
            break;
        case 'sent': 
            $this->db->where([
                'sender' => $user, 
                'sender_deleted !=' => 'yes',
            ]);
            break;
    }

    return $this->db
        ->group_start()
            ->or_like([
                'sender' => $search,
                'msg' => $search,
            ])
        ->group_end()
        ->join('users', 'users.username = messages.sender')
        ->order_by('read', 'no')
        ->get('messages')
        ->result();
}

-1
投票

你可以这样做:

$this->db->get_where('tablename',$whereclause);

我也遇到同样的问题,成功了。

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