Модель Cakephp с несколькими статусами

Я спрашиваю себя кое-что … Вот вопрос:

У меня есть запрос модели. Эта модель имеет статус. (скажем, это целое число)

Как статус будет меняться со временем А ТАКЖЕ так как я хочу вести учет каждого изменения, мне было ясно, что статус не будет полем таблицы / модели запросов.

Я думал, что я добавлю таблицу / модель RequestStatus и скажу CakePHP

Request имеет много RequestStatus

Тогда я подумал, что будет просто получить все запросы, которые имеют только действительный статус.

Но я был неправ.

Использованиеableable не годится, поскольку он запрашивает запрос, даже если у них неправильный статус (или даже если у них нет статуса).

Итак, я протестировал 2 решения:

  • Связывание на лету модели RequestStatus как отношения hasOne, но
    это не работает, как ожидалось

  • Используйте ключ / массив соединений при выполнении поиска.

Я явно что-то упустил, потому что это не работает.

Я что-то пропустил ? Или лучший способ сделать это — иметь поле состояния в таблице запросов?

РЕДАКТИРОВАТЬ : Я забыл упомянуть, что мне нужно использовать этот запрос с нумерацией страниц CakePHP.

0

Решение

Я приму пару вещей, которые вы не упомянули. Прежде всего, я полагаю, вы также создали 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)
));
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector