前提・実現したいこと
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型
なぜ、順番にならないのか、また他にいいやり方があるのなら、ご教授いただければと思います。
よろしくお願いいたします。
あなたの回答
tips
プレビュー