iT邦幫忙

0

[PHP,YaLinqo]詢問語法

舜~ 2019-09-16 11:29:552522 瀏覽

我要計算表格最下方的小計,$list是從資料庫撈出來的所有資料

YaLinqo套件是用php模仿c#的Linq套件中,效能相對比較好的套件,不過該套件無法直接用在資料庫上~

想詢問各位大大們,如果計算小計的方式希望透過一個from($list)->select(...)解決的話,語法要如何呈現?

這是我目前正在使用的code

require_once 'libraries/YaLinqo/Linq.php';

// ...(略)...

while ($row = mysqli_fetch_array($rst, MYSQLI_ASSOC)) {
    $list[] = $row;
}
$totalRow = [
    'ps_year'=>'小計:'
    ,'ttlmoneysum' => from($list)->sum('$v["ttlmoneysum"]')
    ,'rst_moneysum' => from($list)->sum('$v["rst_moneysum"]')
    ,'stunosum' => from($list)->sum('$v["stunosum"]')
    ,'rst_stunosum' => from($list)->sum('$v["rst_stunosum"]')
    ,'licensenosum' => from($list)->sum('$v["licensenosum"]')
    ,'nomoneylicnosum' => from($list)->sum('$v["nomoneylicnosum"]')
    ,'cnt' => from($list)->sum('$v["cnt"]')
];
$list[] = $totalRow;

// ...(略)...

在計算小計的部分嘗試用select來一次處理,看能不能改善效能,但會出現找不到sum()的錯誤...


// 這段做法會出現 Call to undefined function sum() 錯誤,明明上方做法sum沒問題啊@@
$totalRow = from($list)->select('[
    "ps_year"=>"小計:"
    ,"ttlmoneysum"=>sum($v["ttlmoneysum"])
    ,"rst_moneysum"=>sum($v["rst_moneysum"])
    ,"stunosum"=>sum($v["stunosum"])
    ,"rst_stunosum"=>sum($v["rst_stunosum"])
    ,"licensenosum"=>sum($v["licensenosum"])
    ,"nomoneylicnosum"=>sum($v["nomoneylicnosum"])
    ,"cnt"=>sum($v["cnt"])
]')->toArrayDeep();


目前看起來好像沒辦法一個select就處理掉,有幾個替代的思路可以參考
1.額外加入一個假欄位對他做group處理後再selectMany回來了
2.使用 MySQL GROUP ROLLUP 自動處裡小計問題

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
一級屠豬士
iT邦大師 1 級 ‧ 2019-09-16 11:58:32
最佳解答

以前有寫一篇MySQL GROUP BY ROLLUP 的應用
https://ithelp.ithome.com.tw/articles/10136825

你參考看看.

舜~ iT邦高手 1 級 ‧ 2019-09-16 13:59:40 檢舉

!!! 原來還有ROLLUP可以運用,感恩大大告知,晚點回頭來玩玩看~~~

2
dragonH
iT邦超人 5 級 ‧ 2019-09-16 11:56:50

沒用過這個

不過官方教學寫得很清楚

我實測過也沒問題

<?php
require_once './vendor/autoload.php';
use \YaLinqo\Enumerable;

$products = array(
  array('name' => 'Keyboard',    'catId' => 'hw', 'quantity' =>  10, 'id' => 1),
  array('name' => 'Mouse',       'catId' => 'hw', 'quantity' =>  20, 'id' => 2),
  array('name' => 'Monitor',     'catId' => 'hw', 'quantity' =>   0, 'id' => 3),
  array('name' => 'Joystick',    'catId' => 'hw', 'quantity' =>  15, 'id' => 4),
  array('name' => 'CPU',         'catId' => 'hw', 'quantity' =>  15, 'id' => 5),
  array('name' => 'Motherboard', 'catId' => 'hw', 'quantity' =>  11, 'id' => 6),
  array('name' => 'Windows',     'catId' => 'os', 'quantity' => 666, 'id' => 7),
  array('name' => 'Linux',       'catId' => 'os', 'quantity' => 666, 'id' => 8),
  array('name' => 'Mac',         'catId' => 'os', 'quantity' => 666, 'id' => 9),
);

$categories = array(
  array('name' => 'Hardware',          'id' => 'hw'),
  array('name' => 'Operating systems', 'id' => 'os'),
);

$result = from($products)->sum(function($v) {
  return $v['quantity'];
});
print_r($result);

result

2069

你是只有 sum 無法使用嗎

還是全部的 function 都是這樣呢

看更多先前的回應...收起先前的回應...
舜~ iT邦高手 1 級 ‧ 2019-09-16 13:49:35 檢舉

您這個做法是可行的,不過不知道能不能一次處理各欄位加總,所以嘗試透過在select內一次處理就出錯了...不知道是語法哪邊下錯還是不支援這樣的作法~

舜~ iT邦高手 1 級 ‧ 2019-09-16 14:16:43 檢舉

在select內sum會找不到,min/max會出現僅限陣列的錯誤,猜測是我語法錯誤,但不知道正確是怎麼寫...

dragonH iT邦超人 5 級 ‧ 2019-09-16 14:22:47 檢舉

你看到的那個 min/max

應該是原生 php 的 function

不是 YaLinqo 的

dragonH iT邦超人 5 級 ‧ 2019-09-16 15:16:42 檢舉

而且 select 回傳的結果應該跟你想要的不同

e.g.

$result = from($products)
  ->select(function($v, $k) {
    return $v['quantity'];
  })
  ->toArrayDeep();
print_r($result);

上面 code 拿到的結果會是

Array
(
    [0] => 10
    [1] => 20
    [2] => 0
    [3] => 15
    [4] => 15
    [5] => 11
    [6] => 666
    [7] => 666
    [8] => 666
)
舜~ iT邦高手 1 級 ‧ 2019-09-16 15:26:44 檢舉

恩...那可能只能額外加入一個假欄位對他做group處理後再selectMany回來了~~

我要發表回答

立即登入回答