Запрос на присоединение в Cakephp отсутствует результаты

У меня проблемы с запросом на присоединение Cakephp. Моя база данных построена таким образом: контакт принадлежит пользователю

В контроллере контактов есть функция поиска контактов. Контакты можно искать по User.first_name или User.last_name.

Я построил свой запрос так:

$options['contain'] = array(
'User' => array(
'fields' => array('id', 'first_name', 'last_name'),
)
);

$options['conditions']['OR'] = array(
array('Contact.id LIKE' => '%'.$search.'%'),
array('User.first_name LIKE' => '%'.$search.'%'),
array('User.last_name LIKE' => '%'.$search.'%'),
array('Building.title LIKE' => '%'.$search.'%'),
array('City.name LIKE' => '%'.$search.'%'),
array('Manager.first_name LIKE' => '%'.$search.'%'),
array('Manager.last_name LIKE' => '%'.$search.'%'),
);

$contacts = $this->Contact->find('all', $options);

Этот запрос дает мне этот SQL-запрос:

'SELECT `Contact`.`id`, `Contact`.`specific_works`, `Contact`.`user_id`, `User`.`id`, `User`.`first_name`, `User`.`last_name`, FROM `pfre`.`contacts` AS `Contact` LEFT JOIN `pfre`.`authake_users` AS `User` ON (`Contact`.`user_id` = `User`.`id`) WHERE `Contact`.`white_label_id` = 18 AND ((`Contact`.`id` LIKE '%search%') OR (`User`.`first_name` LIKE '%search%') OR (`User`.`last_name` LIKE '%search%') OR (`Building`.`title` LIKE '%search%') OR (`City`.`name` LIKE '%search%') OR (`Manager`.`first_name` LIKE '%search%') OR (`Manager`.`last_name` LIKE '%search%'))'

Это не дает мне результатов, тогда как я должен получить 2 результата (они есть в моей базе данных).

Кто-то понимает, что не так в этом запросе?

Для информации полный (не упрощенный, со всеми полями) запрос:

'SELECT `Contact`.`id`, `Contact`.`specific_works`, `Contact`.`comments`, `Contact`.`follow`, `Contact`.`priority`, `Contact`.`code`, `Contact`.`step`, `Contact`.`intervention_type`, `Contact`.`intervention_precision`, `Contact`.`energy_consumption_before`, `Contact`.`energy_consumption_after`, `Contact`.`ghg_emission_before`, `Contact`.`ghg_emission_after`, `Contact`.`diagnosis_date`, `Contact`.`diagnostician`, `Contact`.`heating_details`, `Contact`.`heater_details`, `Contact`.`equipments_details`, `Contact`.`wall_details`, `Contact`.`floor_details`, `Contact`.`ceiling_details`, `Contact`.`loan_received`, `Contact`.`anah_project`, `Contact`.`labor_cost`, `Contact`.`equipment_cost`, `Contact`.`other_cost`, `Contact`.`cite_amount`, `Contact`.`anah_amount`, `Contact`.`cee_amount`, `Contact`.`eco_amount`, `Contact`.`tva_amount`, `Contact`.`anah_ase_amount`, `Contact`.`ptz_acquisition_amount`, `Contact`.`anah_other_amount`, `Contact`.`other_helps`, `Contact`.`other_loans`, `Contact`.`monthly_payments`, `Contact`.`hide_consumptions`, `Contact`.`abandonment_reason`, `Contact`.`abandonment_reason_other`, `Contact`.`project_source`, `Contact`.`project_source_other`, `Contact`.`renovation_type`, `Contact`.`work_col_1`, `Contact`.`work_col_2`, `Contact`.`considered_energy`, `Contact`.`considered_ges`, `Contact`.`custom_1_energy`, `Contact`.`custom_1_ges`, `Contact`.`custom_2_energy`, `Contact`.`custom_2_ges`, `Contact`.`performed_energy`, `Contact`.`performed_ges`, `Contact`.`favorite_scenario1`, `Contact`.`favorite_scenario2`, `Contact`.`favorite_scenario3`, `Contact`.`archived`, `Contact`.`user_id`, `Contact`.`manager_id`, `Contact`.`white_label_id`, `Contact`.`building_id`, `Contact`.`ceie_id`, `Contact`.`created`, `Contact`.`modified`, `Contact`.`rennes`, (energy_consumption_before - energy_consumption_after) AS  `Contact__energy_consumption_prevented`, (ghg_emission_before - ghg_emission_after) AS  `Contact__ghg_emission_prevented`, `User`.`id`, `User`.`first_name`, `User`.`last_name`, `Manager`.`id`, `Manager`.`first_name`, `Manager`.`last_name`, `Manager`.`email`, `Manager`.`phone`, `Building`.`id`, `Building`.`title`, `Building`.`city_id` FROM `pfre`.`contacts` AS `Contact` LEFT JOIN `pfre`.`authake_users` AS `User` ON (`Contact`.`user_id` = `User`.`id`) LEFT JOIN `pfre`.`authake_users` AS `Manager` ON (`Contact`.`manager_id` = `Manager`.`id`) LEFT JOIN `pfre`.`buildings` AS `Building` ON (`Contact`.`building_id` = `Building`.`id`) INNER JOIN `pfre`.`cities` AS `City` ON (`Building`.`city_id` = `City`.`id`)  WHERE `Contact`.`white_label_id` = 18 AND ((`Contact`.`id` LIKE '%search%') OR (`User`.`first_name` LIKE '%search%') OR (`User`.`last_name` LIKE '%search%') OR (`Building`.`title` LIKE '%search%') OR (`City`.`name` LIKE '%search%') OR (`Manager`.`first_name` LIKE '%search%') OR (`Manager`.`last_name` LIKE '%search%'))'

РЕДАКТИРОВАТЬ :
Я иногда получаю какой-то результат. Это зависит от строки, которую я использую в качестве «поиска», но некоторые из них дают мне правильные результаты.

0

Решение

Я нашел проблему! Когда я строю свой запрос, я устанавливаю соединение:

$options['joins'] = array(
array(
'table' => 'cities',
'alias' => 'City',
'type' => 'INNER',
'conditions' => [
'Building.city_id = City.id'
]
),
);

В некоторых из моих зданий нет city_id. Этот параметр не включает здания без идентификатора city_id или с идентификатором city_id, который не соответствует City.id.

Теперь мне нужно знать, как включить результаты без city_id.

Спасибо всем, кто помог мне получить решение!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector