Использование% like% и JOIN вместе в CodeIgniter - PullRequest
1 голос
/ 02 августа 2011

У меня есть три таблицы: 'users', 'products' и 'product_types'. В таблице «пользователи» хранятся все обычные данные о пользователях моего сайта (включая столбец id); в таблице «products» перечислены product_id продукта, user_id пользователя, добавившего его, и product_type; таблица «product_types» имеет столбец id (что соответствует значению product_type int в таблице «products») и столбец 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 ... Но большую часть времени он показывает только первую строку - в других случаях он возвращается без результатов. Кто-нибудь может сказать мне, где я иду не так?

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Я не понимаю, почему вы делаете несколько запросов, это может быть выполнено только в одном запросе

    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 голос
/ 02 августа 2011

Что я делаю для отладки запросов, так это сначала начинаю с верхнего запроса, а затем просматриваю результаты. Затем я добавляю к нему одно утверждение и снова смотрю на результат.

Итак, для вашего случая вы можете начать с простого случая:

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

Посмотрите на результат, а затем добавьте еще одно утверждение:

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

Делайте это, пока не сформируете весь запрос.

Дело в том, что где-то на пути вы узнаете, какое утверждение фильтрует ваши другие ожидаемые результаты. Это также может быть сделано в обратном направлении.

...