###前提・実現したいこと
コントローラ内でTableRegistry::getを使用して各物件マスターテーブル(Places)と,その各物件からのレポートが毎日追加されるデータテーブル(Data)を取得しております。
各物件(Placeテーブルの各レコード)に対してDataテーブルの最新のレコード一件を結合させたいのですが,粘りましたが上手く行きませんでしたので,こちらでお教えいただこうと思いました。
グループ化によりどのように最新レコードを取得できるか,お教えいただけたら助かります。
Places |
---|
ID |
name |
name_kana |
created |
modified |
Data |
---|
ID |
place_id |
staff_amount_morning |
key_check_morning |
staff_amount_evening |
key_check_evening |
created |
modified |
###発生している問題・エラーメッセージ
今place_idをグループ化する事でplace_idで紐づくDataテーブルのレコードを一つづつに絞るところまでは出来ました。 しかし,グループ化で抽出されたplace_idグループごとのデータが最新のものに出来ません。 (最新でないデータが選ばれてしまいます。)
###該当のソースコード
↓以下は前述の通り,place_id毎に一つずつDataテーブルから取得できているソースです。
public function initialize() { parent::initialize(); $this->places = TableRegistry::get('Places'); $this->data = TableRegistry::get('Data'); } public function occupancy() { $data = $this->data->find() ->contain(['Places']) ->group('place_id') ->all(); $this->set('data', $data); $this->set('_serialize', ['data']); }
↓以下は上記のソースにhavingで条件を付け足して最大値レコードの取得を試みているものですが,結果は空になってしまいます。
public function initialize() { parent::initialize(); $this->places = TableRegistry::get('Places'); $this->data = TableRegistry::get('Data'); } public function occupancy() { $data = $this->data->find() ->contain(['Places']) ->group('place_id') ->having(['max(Data.id)' => 'Data.id']) ->all(); $this->set('data', $data); $this->set('_serialize', ['data']); }
###試したこと
SQLですとinnerJoinを用いて最新のデータ取得等のソース情報がありましたので,CakePHPの書き方に直してみようと試行錯誤しましたが,どうも的外れの様でマニュアルを見ても上手く組むことが出来ずあきらめました。
恐縮ですが,抽出条件の書き方の基本が残念ながら分かっていないようです。
またCakePHP3のクエリビルダを用いてオプションとしてOrderを記載してIDで降順にすることもしてみましたが,配列の並び替えが変わってしまい,グループ化されるデータの並び替え?には影響しないようでした。素人コメントで申し訳ございません。
###補足情報(言語/FW/ツール等のバージョンなど)
PHP7,CakePHP3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/04 03:56 編集
2017/04/04 05:19
2017/04/10 03:41