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 поле из вашего запроса. Сначала вы должны знать две вещи:

  1. Состояние, в котором вы пишете conditions Предложение применяется к таблице, соответствующей вашей модели. В твоем случае, upload таблица, по которой выполняется запрос, а ваша таблица не содержит полей Face.celebrity_id,
  2. $ 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

Другие вопросы по тегам