Cakephp 2.8.4 игнорирует hasMany
Это очень странная проблема, которую я очень долго не мог понять.
У меня есть модель Upload с несколькими hasMany, которые игнорируются UploadModel.
Например. Загрузите уже многие лица.
В таблице комментариев у меня есть поле foreign_key, в котором находится Upload.id. Таким образом, отношения в UploadModel выглядят так:
$hasMany = ['Face' => ['foreignKey' => 'Face.upload_id']];
При выполнении поиска в Upload с содержанием Face + условия [Face.celebrity_id = 4018] я получаю следующую ошибку, потому что в запросе отсутствует Left Join to Face:
$media = $this->Upload->find('all',array(
'conditions' => array(
'Face.celebrity_id' => 4018
),
'contain' => array(
'Face'
)
));
SQL Query:
SELECT `Upload`.`id`, `Upload`.`user_id`, `Upload`.`filename`, `Upload`.`created`
FROM `uploads` AS `Upload`
WHERE `Face`.`celebrity_id` = 4018;
SQL Error:
Unknown column 'Face.celebrity_id' in 'where clause'
Как вы можете видеть, в запросе отсутствует левый переход к Face, вот и вся проблема
Если вместо $hasMany я добавляю отношение Face в $ ownTo, оно добавляет отношение к запросу, и оно работает!
Но выгрузка может иметь много лиц, а Face.upload_id имеет внешний ключ для загрузки, так что он должен быть матерью ***** Хасмани... lol
Как вы можете видеть, это ужасно, я уже в отчаянии, я обошел проблему, добавив bindModel() перед каждым запросом, но это совершенно не нужно, hasMany должна работать!!!! е ****!!!!!
Запрос, который я хочу, чтобы Cake выполнил для меня:
SELECT `Upload`.`id`, `Upload`.`filename` FROM `uploads` AS `Upload`
LEFT JOIN `upload_faces` AS `Face` ON (`Upload`.id = `Face`.`upload_id`)
WHERE `Face`.`celebrity_id` = 4018
Я ценю любую помощь, спасибо.
2 ответа
В вашем test()
функция, вы запускаете запрос на upload
Таблица. Так что не может сравниться Face.celebrity_id
поле из вашего запроса. Сначала вы должны знать две вещи:
- Состояние, в котором вы пишете
conditions
Предложение применяется к таблице, соответствующей вашей модели. В твоем случае,upload
таблица, по которой выполняется запрос, а ваша таблица не содержит полейFace.celebrity_id
, - $ hasMany создает отношения уровня приложения (ассоциации). Таким образом, выполняя запрос, как вы написали в
test()
функция, она не присоединяется к результатам запроса.
Что вы можете сделать, это
$this->find('all', array(
'contain' => array(
'Face' => array('conditions' => 'Face.celebrity_id = 4018'))))
Это вернет все строки upload
таблица со связанной строкой face
таблица, если celebrity_id
является 4018
, иначе null
массив.
Надеюсь, это поможет вам, и если вы хотите, чтобы возвращались только те строки, которые связаны с Face.celebrity_id = 4018
, сначала вы должны запустить запрос на face
таблица, а затем еще один результат первого запроса.
Для более подробной информации о втором случае вы можете сослаться на это.
Хорошо, так что в основном, это не игнорирование hasMany, но я не могу использовать условия для отношения hasMany, может быть сделано только если это hasOne