Cakephp 2.8.4 игнорируя hasMany

0

Это очень странная проблема, которую я не смог найти в течение очень долгого времени.

У меня есть модель Загрузить, при этом несколько 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'

Как видите, в запросе отсутствует левое соединение с Face, что все проблемы

Если вместо $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

Я ценю любую помощь, спасибо.

Теги:
cakephp
models
cakephp-2.8

2 ответа

0

В вашей функции 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 is 4018, в противном случае массив null.

Надеемся, что это поможет вам, и если вы хотите, чтобы возвращались только те многие строки, которые связаны с Face.celebrity_id = 4018, сначала вам нужно запустить запрос в таблице face, а затем другой результат первого запроса.

Для более подробной информации о втором случае вы можете ссылаться на this.

  • 0
    Я думаю, что я не объяснил себя должным образом. Но я считаю , что это вопрос CakePHP, или проблему в моей модели, потому что вы можете использовать условие на объединенную модели, я делал это раньше, SQL примера: SELECT 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
  • 0
    Может быть, стоит попробовать это: [ссылка] ( stackoverflow.com/a/18116633/5260631 ) и, если вы сначала не уверены в своем вопросе, то вам следует запросить решение, которое необходимо. Вниз голосование ответ не то, что вы должны делать, когда ваш вопрос неоднозначен.
Показать ещё 1 комментарий
0

ok, так что в основном, это не игнорирует hasMany, но я не могу использовать условия для отношения hasMany, может быть выполнено только в том случае, если hasOne

Ещё вопросы

Сообщество Overcoder
Наверх
Меню