Я разрабатываю API, построенный с PHP и Codeigniter, и я использую MySQL как базу данных.
У меня есть пользовательская таблица под названием «Пользователи», которая содержит следующие столбцы:
- ID - Firstname - Lastname - Email
Как пользователь может выполнить поиск в этой таблице с использованием полного имени? Например, он отлично подходит для поиска Мартином или Смитом, но не Мартином Смитом.
Это запрос, который я использую сейчас:
$this->db->select('*'); $this->db->from('users'); $this->db->like('firstname', $args['query']); $this->db->or_like('lastname', $args['query']);
Обновить
Если я использую этот запрос, как предложено ниже, я ничего не могу найти. Не с полным именем, именем или фамилией. Тогда как имя, так и фамилия должны быть одним и тем же словом.
$this->db->select('*'); $this->db->from('users'); $this->db->like('firstname', $args['query']); $this->db->like('lastname', $args['query']);
Прямо из головы, но как насчет
$input = 'Martin Smith'; $names = explode($input); $this->db->select('*'); $this->db->from('users'); $this->db->where_in('firstname', $names); $this->db->or_where_in('lastname', $names);
Должно вывести что-то вроде:
SELECT * FROM users WHERE firstname IN ('Martin', 'Smith') OR lastname IN ('Martin', 'Smith')
Пытаться:
$this->db->select('*'); $this->db->from('users'); $this->db->like('firstname', $args['first_name']); $this->db->like('lastname', $args['last_name']);
Это приводит к:
Select * from users WHERE firstname LIKE '%first_name%' AND lastname LIKE '%last_name%
Изменить: $this->db->or_like('lastname', $args['query']);
To: $this->db->like('lastname', $args['query']);
Вы должны изменить это ИЛИ для И:
SELECT * FROM users WHERE Firstname = '$firstname' AND Lastname = '$lastname'
Я делаю это и отлично работаю для меня:
$terms = explode(' ', $searchtxtusername); if(count($terms)>1){ $this->db->like('u.first_name', $this->db->escape_like_str($terms[0])); $this->db->like('u.last_name', $this->db->escape_like_str($terms[1])); }else{ $this->db->like('u.first_name', $this->db->escape_like_str($terms[0])); $this->db->or_like('u.last_name', $this->db->escape_like_str($terms[0])); }
Здесь $ searchtxtusername – это поисковый запрос, включающий имя и фамилию (пробел разделен). Если есть только один термин, то он проверяет один и тот же термин для имени и фамилии.
Пример: если я искал Боба, то условие поиска выглядит так:
first_name LIKE '%Bob%' AND last_name LIKE '%Bob%'
и если я искал Боба Беггинса, тогда условие поиска будет:
first_name LIKE '%Bob%' AND last_name LIKE '%Beggins%'