【问题标题】:Try to search with Full name using Codeigniter尝试使用 Codeigniter 搜索全名
【发布时间】:2018-02-19 17:50:47
【问题描述】:

这是我的表格,如下所示。

Id  Firstname Lastname
1   Akhil     Mokariya
2   Harshit   joshi

当我搜索结果“Akhil Mokariya”时,它给了我空记录,但我需要如下结果。

1  Akhil Mokariya

我的查询如下所示。

$searcharray = array(
            'students.firstname' => $searchterm,
            'students.lastname' => $searchterm,
            'students.guardian_name' => $searchterm,
            'students.adhar_no' => $searchterm,
            'students.samagra_id' => $searchterm,
            'students.roll_no' => $searchterm,
            'students.admission_no' => $searchterm,
        );

        $this->db->select('classes.id AS `class_id`,students.id,classes.class,sections.id AS `section_id`,sections.section,students.id,students.admission_no , students.roll_no,students.admission_date,students.firstname,  students.lastname,students.image,    students.mobileno, students.email ,students.state ,   students.city , students.pincode ,     students.religion,     students.dob ,students.current_address,    students.permanent_address,IFNULL(students.category_id, 0) as `category_id`,IFNULL(categories.category, "") as `category`,      students.adhar_no,students.samagra_id,students.bank_account_no,students.bank_name, students.ifsc_code ,students.father_name , students.guardian_name , students.guardian_relation,students.guardian_phone,students.guardian_address,students.is_active ,students.created_at ,students.updated_at,students.gender,students.rte,student_session.session_id')->from('students');
        $this->db->join('student_session', 'student_session.student_id = students.id');
        $this->db->join('classes', 'student_session.class_id = classes.id');
        $this->db->join('sections', 'sections.id = student_session.section_id');
        $this->db->join('categories', 'students.category_id = categories.id', 'left');
        $this->db->where('student_session.session_id', $this->current_session);
        $this->db->group_start();
        $this->db->or_like($searcharray);
        $this->db->group_end();
        $this->db->order_by('students.id');
        // $this->db->limit('100');
        $query = $this->db->get();

【问题讨论】:

  • 看起来您有几张桌子,而您只提供了一张。
  • 是的,它的多表连接,但我用名字和姓氏连接搜索。
  • @Magnus Eriksson 不清楚,你在说什么?
  • $searchterm 包含什么值?
  • @Parnasree Chowdhury 是“Akhil Mokariya”

标签: php codeigniter


【解决方案1】:

我在自己的搜索中发现,我会检查搜索是否是包含空格的字符串,因此我可以将其拆分并用作名字和姓氏:

if( strpos( $searchterm, ' ' ) !== FALSE )
    $search_parts = explode(' ', $searchterm);

然后,您可能需要确保有两个部分:

if( count( $search_parts ) == 2 ){
    // you know you have two parts
}

那么你就可以使用数组中的部分了:

'students.firstname' => $search_parts[0],
'students.lastname' => $search_parts[1],

如果它们可能出现故障:

'students.firstname' => $search_parts[1],
'students.lastname' => $search_parts[0],

我正在使用不同的方式来创建查询,但为了向您展示一个示例,我这样做:

if( strpos( $search, ' ' ) !== FALSE )
{
    $search_parts = explode(' ', $search);

    $sql .= ' 
        OR (
            first_name LIKE "%' . $this->db->escape_like_str( current($search_parts) ) . '%" ESCAPE "!" AND  
            last_name LIKE "%' . $this->db->escape_like_str( end($search_parts) ). '%" ESCAPE "!"
        ) ';

    reset($search_parts);

    $sql .= ' 
        OR (
            last_name LIKE "%' . $this->db->escape_like_str( current($search_parts) ) . '%" ESCAPE "!" AND 
            first_name LIKE "%' . $this->db->escape_like_str( end($search_parts) ). '%" ESCAPE "!"
        ) 
    ';
}

另外,如果您不关心代码可移植性,您应该使用 CONCAT 看到这个答案:Mysql Concat two columns while searching with LIKE

最终看起来像这样:

// Check if search was input as full name
if( strpos( $search, ' ' ) !== FALSE )
{
    $sql .= ' 
        OR ( CONCAT( first_name, " ", last_name ) LIKE "%' . $this->db->escape_like_str( $search ) . '%" ESCAPE "!" )  
        OR ( CONCAT( last_name, " ", first_name ) LIKE "%' . $this->db->escape_like_str( $search ) . '%" ESCAPE "!" ) ';
}

所以,就你而言,我认为你应该能够做到这一点:

$searcharray = array(
    'students.firstname' => $searchterm,
    'students.lastname' => $searchterm,
    'students.guardian_name' => $searchterm,
    'students.adhar_no' => $searchterm,
    'students.samagra_id' => $searchterm,
    'students.roll_no' => $searchterm,
    'students.admission_no' => $searchterm,
    'CONCAT(students.firstname, " ", students.lastname)' => $searchterm,
    'CONCAT(students.lastname, " ", students.firstname)' => $searchterm
);

【讨论】:

  • 如何在我的情况下提出上述查询。
  • 我更新了我的答案。在我的服务器上对其进行了测试,并使用了 or_like()。
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 2012-07-29
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2014-06-05
相关资源
最近更新 更多