Найти метод с помощью JOIN в CakePHP
В этом вопросе рассматривается, как выполнить запрос, объединяющий две таблицы, сообщения и пользователей, с помощью поиска CakePHP. метод. В частности, нам нужно получить информацию из обеих таблиц на основе условия, когда поле messages.from равно полюusers.id, а поле messages.to равно 4.
Существуют два основных методы достижения такого соединения в CakePHP: стандартный способ CakePHP и использование пользовательского соединения.
Стандартный способ CakePHP
Рекомендуемый подход — использовать стандартный метод CakePHP, который включает в себя создание связей между моделями и использование сдерживаемого поведения. Вот как это сделать:
Определите отношения в моделях пользователя и сообщения:
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array('Message'); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array('User'); }
Выполните следующий поисковый запрос:
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Пользовательское объединение
В качестве альтернативы вы можете использовать произвольное объединение в запросе поиска:
$this->Message->find('all', array( 'joins' => array( array( 'table' => 'users', 'alias' => 'UserJoin', 'type' => 'INNER', 'conditions' => array( 'UserJoin.id = Message.from' ) ) ), 'conditions' => array( 'Message.to' => 4 ), 'fields' => array('UserJoin.*', 'Message.*'), 'order' => 'Message.datetime DESC' ));
В этом пользовательском объединении мы явно определяем условия объединения и выбираем возвращаемые поля.
Использование двух отношений к одной и той же модели
Если вы хотите установить две связи с одной и той же моделью, вы можете определить их следующим образом:
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array( 'MessagesSent' => array( 'className' => 'Message', 'foreignKey' => 'from' ), 'MessagesReceived' => array( 'className' => 'Message', 'foreignKey' => 'to' ) ); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array( 'UserFrom' => array( 'className' => 'User', 'foreignKey' => 'from' ), 'UserTo' => array( 'className' => 'User', 'foreignKey' => 'to' ) ); }
Определив эти связи, вы можете использовать такой запрос поиска:
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3