Есть два основных способа сделать это. Один из них является стандартным способом CakePHP, а другой использует пользовательское объединение.
Стоит отметить, что этот совет для CakePHP 2.x, а не 3.x.
CakePHP Way
Вы бы создали связь с вашей моделью пользователя и моделью сообщений и использовали бы сдерживаемое поведение:
class User extends AppModel {
public $actsAs = array('Containable');
public $hasMany = array('Message');
}
class Message extends AppModel {
public $actsAs = array('Containable');
public $belongsTo = array('User');
}
Вам нужно изменить столбец messages.from
на messages.user_id
, чтобы торт мог автоматически связать записи для вас.
Затем вы можете сделать это из контроллера сообщений:
$this->Message->find('all', array(
'contain' => array('User')
'conditions' => array(
'Message.to' => 4
),
'order' => 'Message.datetime DESC'
));
Другой способ CakePHP
Я рекомендую использовать первый метод, потому что он сэкономит вам много времени и работы. Первый метод также создает основу для установления отношений, которые можно использовать для любого количества других вызовов и условий поиска, помимо того, которое вам нужно сейчас. Тем не менее, cakePHP поддерживает синтаксис для определения ваших собственных объединений. Это будет сделано так, с MessagesController
:
$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'
));
Обратите внимание, я оставил имя поля messages.from
таким же, как ваша текущая таблица в этом примере.
Использование двух отношений к одной и той же модели
Вот как вы можете сделать первый пример, используя два отношения к одной и той же модели:
class User extends AppModel {
public $actsAs = array('Containable');
public $hasMany = array(
'MessagesSent' => array(
'className' => 'Message',
'foreignKey' => 'from'
)
);
public $belongsTo = array(
'MessagesReceived' => array(
'className' => 'Message',
'foreignKey' => 'to'
)
);
}
class Message extends AppModel {
public $actsAs = array('Containable');
public $belongsTo = array(
'UserFrom' => array(
'className' => 'User',
'foreignKey' => 'from'
)
);
public $hasMany = array(
'UserTo' => array(
'className' => 'User',
'foreignKey' => 'to'
)
);
}
Теперь вы можете делать свой поиск так:
$this->Message->find('all', array(
'contain' => array('UserFrom')
'conditions' => array(
'Message.to' => 4
),
'order' => 'Message.datetime DESC'
));