Ответ 1
Есть два основных способа, которыми вы можете это сделать. Один из них - стандартный способ CakePHP, а другой - пользовательское соединение.
Стоит отметить, что этот совет предназначен для CakePHP 2.x, а не 3.x.
Путь 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');
}
Вам нужно изменить столбец 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'
));