Это очень странная проблема, которую я не смог найти в течение очень долгого времени.
У меня есть модель Загрузить, при этом несколько hasMany игнорируются UploadModel.
Например. Загрузить hasMany Лицо.
В таблице комментариев у меня есть поле с именем 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 в $belongsTo, она добавляет отношение к запросу и работает!
Но у Upload может быть много Faces, а Face.upload_id имеет значение ForeignKey для загрузки, поэтому IT НЕОБХОДИМО БЫТЬ Материнским ***** HASMANY... lol
Как вы можете видеть, это ужасно, я уже в отчаянии, я обошел проблему, добавив bindModel() перед каждым запросом, но это совершенно не нужно, hasMany должен работать!!!! F ****!!!!!
Запрос, который я хочу, чтобы 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
Я ценю любую помощь, спасибо.
В вашей функции 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
is 4018
, в противном случае массив null
.
Надеемся, что это поможет вам, и если вы хотите, чтобы возвращались только те многие строки, которые связаны с Face.celebrity_id = 4018
, сначала вам нужно запустить запрос в таблице face
, а затем другой результат первого запроса.
Для более подробной информации о втором случае вы можете ссылаться на this.
Upload
. id
, Upload
. filename
ОТ uploads
filename
AS Upload
LEFT JOIN upload_faces
AS Face
ON ( Upload
.id = Face
. upload_id
) WHERE Face
. celebrity_id
= 4018
ok, так что в основном, это не игнорирует hasMany, но я не могу использовать условия для отношения hasMany, может быть выполнено только в том случае, если hasOne