CakePHP объединение таблиц при наличии связи

#php #activerecord #cakephp

#php #activerecord #cakephp

Вопрос:

У меня есть Message модель, которая имеет множество Librarian .

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь присоединить таблицу к Librarian таблице, эта таблица еще не была присоединена — т. Е. созданное мной соединение появляется до создания соединения отношений.

 $this->Message->find('all', array(
  'joins' => array(
    array(
      'table' => 'users',
      'alias' => 'User',
      'conditions' => array('User.id = Librarian.id')
    )
  )
));
  

Это генерирует запрос в следующих строках:

 SELECT `Message`.`id`, `Message`.`librarian_id`, 
   `Message`.`Librarian`.`id`, `Librarian`.`user_id` 
    FROM `contact_messages` AS `Message` 
    INNER JOIN users AS `User` ON (`User`.`id` = `Librarian`.`user_id`) 
    LEFT JOIN `librarians` AS `Librarian` 
    ON (`Message`.`librarian_id` = `Librarian`.`id`)  
    WHERE `Message`.`id` = 3
  

Я получаю сообщение об ошибке

Неизвестный столбец ‘Librarian.user_id’ в ‘предложении on’

Как я могу присоединиться к таблице hasMany после того, как она уже была включена в запрос сборки?

Приветствия

Комментарии:

1. Возможно, здесь я ошибаюсь — обычно я использовал два левых соединения для эмуляции habtm (что вы, похоже, делаете здесь — сообщение пользователям habtm)

Ответ №1:

Я стремился решить эту проблему, фактически привязывая связь к коду по ходу работы. Это хакерский метод и довольно старый, всего 1.2.

Это было использование, bindModel() о котором вы можете прочитать здесь, http://book.cakephp.org/view/3/The-Manual #!/view/78/Ассоциации-Связывание-моделей-вместе

Документация по методу model находится здесь, http://api12.cakephp.org/class/model#method-ModelbindModel

Идея в основном заключается в том, что вы можете временно связать две модели вместе, даже если никакой связи не существует, или если они имеют отдаленную связь. Я это сделал, и это действительно работает. У меня где-то есть некоторый код, но его нет под рукой.

Также, если вы используете более новые материалы, обязательно ознакомьтесь Containable() поскольку это, насколько я понимаю, включает в себя немного больше привязок модели. http://book.cakephp.org /#!/view/1323/Вместимый

Ответ №2:

Я не уверен, насколько хорошо я объяснил себя.

Вероятно, мне следовало бы разбить проблему на точные взаимосвязи:

Сообщение имеет много библиотекарей
,

это означает, что я могу настроить recursive = 2 получение пользовательских данных.

Конечно, это дорого, но в данном случае это естественная вещь.