Это очень странная проблема, которую я не мог понять в течение очень долгого времени.
У меня есть модель Загрузить, с несколькими имеет много все игнорируются 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'
Если вместо $ 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
Я ценю любую помощь, спасибо.
хорошо, так что в основном, это не игнорирование hasMany, но я не могу использовать условия для отношения hasMany, может быть сделано только если это hasOne
В вашем test()
функция, вы запускаете запрос на upload
Таблица. Так что не может сравниться Face.celebrity_id
поле из вашего запроса. Сначала вы должны знать две вещи:
conditions
Предложение применяется к таблице, соответствующей вашей модели. В твоем случае, upload
таблица, по которой выполняется запрос, а ваша таблица не содержит полей Face.celebrity_id
, 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
таблица, а затем еще один результат первого запроса.
Для более подробной информации о втором случае вы можете обратиться этот.