PHP Codeigniter - присоединяется к таблице, если столбец не равен NULL

Настройка:

Codeigniter 3 работает на одном из вариантов сервера PHP 5. Использование построителя запросов для работы с файлом db.

Фон:

Создание программного обеспечения с профилем клиента. Пользователи могут добавить несколько заметок в профиль и связать контакт с этой заметкой. Затем профиль отображает все заметки и контакт в соответствующем профиле с использованием метода join() из Query Builder Codeigniter 3.

Проблема:

Заметка может быть добавлена ​​без контакта с клиентом, в случае обобщенной заметки. Это устанавливает значение по умолчанию NULL в базе данных, что, в свою очередь, не позволяет client_model возвращать заметки, поскольку она не может присоединиться к таблицам.

Текущий код:

function get_client_notes($client_id)
{   
    $this->db->join('nh_note_types', 'nh_note_types.type_id = nh_client_notes.client_notes_type');
    $this->db->join('nh_user_profiles', 'nh_user_profiles.user_profile_user_id = nh_client_notes.client_notes_added_by');
    $this->db->join('nh_client_contacts', 'nh_client_contacts.client_contact_id = nh_client_notes.client_notes_client_contact_id');
    $this->db->order_by("client_notes_added_date", "desc");
    $query = $this->db->get_where('nh_client_notes', array('client_notes_client_id' => $client_id));
    return $query;
}

В настоящее время, если значение для client_notes_client_contact_id равно NULL, он не будет возвращать никаких данных для этой строки.

Я пытаюсь выяснить, есть ли способ сделать следующее: ЕСЛИ client_notes_client_contact_id не равно нулю, тогда присоединяйтесь к таблицам, иначе продолжайте прошлое.

Или любым другим способом присоединения к таблицам, если есть значение и где оно NULL, тогда не присоединяться.

Любая помощь приветствуется!


person Tom Pearce    schedule 23.03.2016    source источник
comment
Непонятно, о чем вы спрашиваете ... СОЕДИНЕНИЯ не происходят для значений NULL (потому что null на самом деле означает отсутствие значения), и это работает для каждой строки, поэтому вы уже должны получать результаты для строк, которые имеют не- NULL значение.   -  person Narf    schedule 23.03.2016
comment
Моя ошибка, переформулировал вопрос и обновил код, добавив полную функциональность.   -  person Tom Pearce    schedule 23.03.2016
comment
@TomPearce join() эквивалентен соединению MySQL, поэтому он не соединяется по значениям, где он NULL, так что вам нужно, чтобы это (nh_client_contacts) условие было LEFT JOIN, чтобы остальные можно было найти? Перед возвратом $query - log_message() $this->db->last_query(). Сначала поработайте с MySQL, а затем исправьте это в построителе.   -  person MackieeE    schedule 24.03.2016
comment
@MackieeE Спасибо за это, отлично сработало! Отмечу как ответ, если вы опубликуете! :)   -  person Tom Pearce    schedule 24.03.2016
comment
@TomPearce Рад слышать, что в конце концов все получилось! знак равно   -  person MackieeE    schedule 24.03.2016


Ответы (1)


Ваш текущий запрос MySQL с указанным выше построителем запросов будет "строиться" следующим образом:

SELECT 
   * 
FROM 
   nh_client_notes
JOIN nh_note_types ON 
   ( nh_note_types.type_id = nh_client_notes.client_notes_type )
JOIN nh_user_profiles ON 
   ( nh_user_profiles.user_profile_user_id = nh_client_notes.client_notes_added_by )
JOIN nh_client_contacts ON 
   ( nh_client_contacts.client_contact_id 
       = 
     nh_client_notes.client_notes_client_contact_id 
   )
WHERE 
   client_notes_client_id = 479
ORDER BY  
   client_notes_added_date DESC

Однако для этого потребуется, чтобы у всех JOIN был соответствующий доступный идентификатор. Таким образом, правильный MySQL будет LEFT JOIN на client_notes_client_contact_id ключе, который, как вы и просили, должен быть условным.

В этом случае настройте свой построитель запросов, чтобы он имел третий параметр в _ 4_, чтобы это оставалось" левым ".

<?php
$this->db->join(
  'nh_client_contacts', 
  'nh_client_contacts.client_contact_id = nh_client_notes.client_notes_client_contact_id', 
  'left' 
);
?>

При этом ваш запрос будет исправлен, чтобы вернуть client_notes независимо от client_notes_client_contact_id.

person MackieeE    schedule 24.03.2016