UserモデルとMessageモデルを結合してリストを取得した時に、ユーザーの最新のメッセージ1件のみに制限してViewにリストを渡したいです。
Modelは他のViewで一覧取得しているため、Modelのconditionで取得メッセージの制限はしたくありません。
そのためコントローラの処理で件数を制限して取得したいです。
UsersController.php
lang
1 public function find_user(){ 2 $message = null; 3 $result = false; 4 if($this->request->is('post')) { 5 if(!empty($this->request->data['User']['word'])){ 6 $findListName = null; 7 $this->set('findWord',$this->request->data['User']['word']); 8 9 $findWord = '%'.$this->request->data['User']['word'].'%'; 10 $findListName = $this->User->find('list',array( 11 'conditions' => array('OR' => array( 12 'User.username LIKE' => $findWord, 13 'User.name LIKE' => $findWord)), 14 'fields' => array('User.id') 15 16 )); 17 18 $this->set('resultList',$this->User->find('all',array( 19 'conditions' => array('AND' => array( 20 'User.id' => $findListName)), 21 'Message' => array('limit' => 1) 22 23 ))); 24 $message = '検索結果を表示します。' ; 25 return $this->render('find_user_result'); 26 //return(処理をここで終わらせる)render(処理を元の処理ではなく、値のURLに飛ばす。 27 } else { 28 $message = '検索ワードを入力してください。'; 29 } 30 } 31 $this->Session->setFlash($message); 32 } 33
$this->set('resultList',$this->User->find('all',array( 'conditions' => array('AND' => array( 'User.id' => $findListName)), 'Message' => array('limit' => 1)
上記の処理を実行すると、viewのdebug($resultList)では全件戻ってきます。
'Message' => array('limit' => 1)を
'limit' => array('Message' => 1)と入力すると下記のようにユーザー1件分しか戻ってきません。Messageは1件でユーザーリストは全件返したいです。
lang
1array( 2 (int) 0 => array( 3 'User' => array( 4 'password' => '*****', 5 'id' => '41', 6 'username' => 'satoshii', 7 'name' => 'さとし1', 8 'mail' => 'satoshi@gmail.com', 9 'hidden_flag' => false, 10 'created' => '2015-06-21 23:03:00' 11 ), 12 'Message' => array( 13 (int) 0 => array( 14 'id' => '24', 15 'u_id' => '41', 16 'murmur' => 'つぶやきuser41つぶやき2個', 17 'created' => '2015-06-18 18:12:00' 18 ), 19 (int) 1 => array( 20 'id' => '23', 21 'u_id' => '41', 22 'murmur' => 'つぶやきuser41つぶやき1個', 23 'created' => '2015-06-18 12:12:00' 24 ) 25 ) 26 ) 27)
ここの処理で、最新のメッセージ1件のみを取得する方法がいまいちわかりません。
ちなみにMessageモデルとUserモデルを連結した時にMessage.createdでDESCしているので、順序は最新のつぶやき順になっているので、頭の1件だけ取得するような処理であれば大丈夫なはずです。
一応ですが、下記がモデルになります。
lang
1App::uses('AppModel', 'Model'); 2 3class Message extends AppModel { 4 5 public $name = 'Message'; 6 public $primaryKey = 'id'; 7 public $belongsTo = array( 8 'User' => array( 9 'className' => 'User', 10 'foreignKey' => 'u_id', 11 'order' => 'Message.created DESC' 12 )); 13}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。