Friday 15 April 2011

php - Cakephp Model with multiple status -



php - Cakephp Model with multiple status -

i'm asking myself something... here question :

i have model request. model has status. (let's integer)

as status alter through time and want maintain record of each changes pretty clear in mind status not field of request table/model.

i thought add together table/model requeststatus , cakephp

request hasmany requeststatus

then thought simple retrieve request has valid status only.

but wrong.

using containable not retrieve request if have wrong status (or if don't have status).

so, tested 2 solutions :

binding on fly requeststatus model hasone relation not works expected

use joins key/array when making find call.

there missed because, not working.

am missing ? or best way having status field in request table ?

edit : forgot mention need utilize query pagination of cakephp

i assume couple of things didn't mention. first of all, suppose created requeststatus belongsto request relationship. , imagine requeststatus table have 4 columns: id, status, request_id , created. request_id column foreign key , created magic field cakephp populates when new row created. assume using containable behaviour.

with that, can go 3 different ways:

1) can retrieve lastly valid statuses along requests.

in requestmodel:

public function getvalidrequests() { $db = $this->requeststatus->getdatasource(); $subquery = $db->buildstatement(array( 'fields' => array('request_id', 'max(created) lastcreated'), 'table' => $db->fulltablename($this->requeststatus), 'alias' => 'temp', 'group' => array('request_id') ), $this->requeststatus); homecoming $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) can retrieve requests status, homecoming lastly valid status.

in requestmodel:

public function getvalidrequests() { $requests = $this->find('all', array( 'contain' => array( 'requeststatus' => array( 'order' => array('requeststatus.created' => 'desc') ) ) )); $result = array(); foreach ($requests $request) { if ($request['requeststatus'][0]['status'] == 1) $result[] = $request; } homecoming $result; }

3) denormalization.

add last_status column in request table. every time update request's status, insert new status requeststatus table , save new status request.last_status. can do:

public function getvalidrequests() { homecoming $this->find('all', array( 'conditions' => array('request.last_status' => 1) )); }

php cakephp cakephp-2.0 has-many

No comments:

Post a Comment