Я спрашиваю себя кое-что … Вот вопрос:
У меня есть запрос модели. Эта модель имеет статус. (скажем, это целое число)
Как статус будет меняться со временем А ТАКЖЕ так как я хочу вести учет каждого изменения, мне было ясно, что статус не будет полем таблицы / модели запросов.
Я думал, что я добавлю таблицу / модель RequestStatus и скажу CakePHP
Request
имеет много RequestStatus
Тогда я подумал, что будет просто получить все запросы, которые имеют только действительный статус.
Но я был неправ.
Использованиеableable не годится, поскольку он запрашивает запрос, даже если у них неправильный статус (или даже если у них нет статуса).
Итак, я протестировал 2 решения:
Связывание на лету модели RequestStatus как отношения hasOne, но
это не работает, как ожидалось
Используйте ключ / массив соединений при выполнении поиска.
Я явно что-то упустил, потому что это не работает.
Я что-то пропустил ? Или лучший способ сделать это — иметь поле состояния в таблице запросов?
РЕДАКТИРОВАТЬ : Я забыл упомянуть, что мне нужно использовать этот запрос с нумерацией страниц CakePHP.
Я приму пару вещей, которые вы не упомянули. Прежде всего, я полагаю, вы также создали RequestStatus belongsTo Request
отношения. И я представляю, что ваша таблица RequestStatus имеет четыре столбца: id
, status
, request_id
а также created
, request_id
столбец является внешним ключом и created
магическое поле, которое заполняет CakePHP при создании новой строки. Я также предполагаю, что вы используете контейнерное поведение.
С этим вы можете пойти тремя различными путями:
1) Вы можете получить последние действительные статусы вместе с их запросами.
В вашей RequestModel:
public function getValidRequests() {
$db = $this->RequestStatus->getDataSource();
$subquery = $db->buildStatement(array(
'fields' => array('request_id', 'max(created) as lastcreated'),
'table' => $db->fullTableName($this->RequestStatus),
'alias' => 'temp',
'group' => array('request_id')
), $this->RequestStatus);
return $this->RequestStatus->find('all', array(
'contain' => array('Request'),
'joins' => array(
array(
'table' => '(' . $subquery . ')',
'alias' => 'rs2',
'type' => 'right',
'conditions' => array(
'RequestStatus.request_id = rs2.request_id',
'RequestStatus.created = rs2.lastcreated'
)
)
),
'conditions' => array('RequestStatus.status' => 1),
'order' => array('RequestStatus.request_id' => 'desc')
));
}
2) Вы можете получить все запросы с их статусом, а затем вернуть только те, которые имеют последний действительный статус.
В вашей RequestModel:
public function getValidRequests() {
$requests = $this->find('all', array(
'contain' => array(
'RequestStatus' => array(
'order' => array('RequestStatus.created' => 'desc')
)
)
));
$result = array();
foreach ($requests as $request) {
if ($request['RequestStatus'][0]['status'] == 1)
$result[] = $request;
}
return $result;
}
3) Денормализация.
Добавить last_status
колонка в вашем Request
Таблица. Поэтому каждый раз, когда вы обновляете статус запроса, вставляйте этот новый статус в свой RequestStatus
таблица и сохранить этот новый статус в Request.last_status
, Теперь вы можете просто сделать:
public function getValidRequests() {
return $this->find('all', array(
'conditions' => array('Request.last_status' => 1)
));
}
Других решений пока нет …