質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

0回答

921閲覧

CakePHP4 Pagination Order 順番にならない

MKannna

総合スコア4

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2022/03/07 06:22

前提・実現したいこと

data

1 [Foods] => Array( 2 [0] => Array ( 3 [id] => 1 4 [name] => aaaaa 5 [sub_foods] => Array( 6 [0] => Array 7 ( 8 [value] => 41 9 [kcal] => 88.00 10 ) 11 [1] => Array 12 ( 13 [value] => 47 14 [kcal] => 122.00 15 ) 16 ) 17 ) 18 ・・・・・ 19 )

上記のようなデータのsub_foodsの最初のkcalの順番に並び変えたいのですが
うまくいきません。ご教授お願いします。

試したこと

controller

1public function pagenatelist(){ 2 if ($this->request->is('ajax')) { 3 $this->viewBuilder()->enableAutoLayout(false); 4 $array = $_GET["sel"]; 5 if (isset($array["sort"])) { 6 ① $order = ['cal'=>"DESC"]; 7 ② $order = ['CAST(cal AS DECIMAL)'=>"DESC"]; 8 } else { 9 $order = ['name'=>"DESC"]; 10 } 11 $this->paginate = [ 12 'limit'=>15, 13 'order'=>$order, 14 'sortableFields'=>["cal"], 15 'sortWhitelist' =>["cal"], 16 ]; 17 18 $lists = function($food,$key,$mapReduce) use($array){ 19 $food->cal = (int)reset($food["sub_foods"])["kcal"]; 20 $mapReduce->emit($food); 21 }; 22 $foods = $this->Foods 23 ->contain('SubFoods',function($q) use($array,$st){ 24 ・・・・・ 25 return $q; 26 }) 27 ->select(["id","name","cal"]) 28 ->mapReduce($lists); 29 30 //$this->paginateのorder以下を削除して下記を実行してみました。 31 if (isset($array["sort"])) { 32 ① $foods->order(['cal'=>"DESC"],true); 33 ① $foods->order(['CAST(cal AS DECIMAL)'=>"DESC"],true); 34 } 35 $this->set('foods',$this->paginate($foods)); 36 } 37}

実行結果は下記になります。

DATA

1[Foods.id]=>[Foods.cal] 2①の結果 3 [8] => 599.00 4 [17] => 165.00 5 [16] => 14.00 6 [15] => 0.00 7 [13] => 151.00 8 [12] => 168.00 9 [11] => 60.00 10 [10] => 921.00 11 [9] => 54.00 12 [4] => 125.00 13 [1] => 37.00 14 [2] => 30.00 15 [3] => 17.00 16 [6] => 216.00 17 [7] => 437.00 18②の結果 19 [12] => 168.00 20 [17] => 165.00 21 [7] => 437.00 22 [18] => 200.00 23 [21] => 529.00 24 [29] => 46.00 25 [32] => 77.00 26 [33] => 88.00 27 [36] => 88.00 28 [8] => 599.00 29 [34] => 88.00 30 [1] => 37.00 31 [2] => 30.00 32 [5] => 25.00 33 [11] => 60.00

補足情報

アソシエーション先の複数あるデータから特定の一つを抽出してソートする方法が見つからず、仮のフィールドに値を入れて、ソートしようとしたのですが、
「Unknown column '仮フィールド' in 'field list' in'...」
となってしまい、sort用にMysql側で”cal”フィールドを追加して上記に至っております。

SubFoods.kcal = decimal型
Foods.cal = int型

なぜ、順番にならないのか、また他にいいやり方があるのなら、ご教授いただければと思います。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問