簡體   English   中英

PHP Laravel 發現 2 查詢生成器之間的區別

[英]PHP Laravel find a difference between 2 Query Builder

我想找到從查詢生成器獲得的 2 個值之間的差異。 獲得的價值必須在正確的校區和月份內。 我想查找上一個日期值、當前日期值和下一個日期值。 之后,找到差異當前值 - 先前值(將其命名為用法)。 問題是,當我 foreach 查詢生成器時,它只為每個查詢顯示 1 個值而不是 2 個值。 請幫我。

$metercurr = DB::table('smt_meter_reading')
                       ->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
                       ->select(DB::raw('SUM(actual_generation) as total1', 'smt_meter_reading.id', 'smt_smart_meter.serial_number'))
                       ->whereBetween('read_time',[$currDate, $nextDate])
                       ->where('smt_smart_meter.campus_id', $bill->campus_id)
                       ->groupBy('smt_meter_reading.smt_smart_meter_id')
                       ->get();
    
$meterprev = DB::table('smt_meter_reading')
                       ->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
                       ->select(DB::raw('SUM(actual_generation) as total2', 'smt_smart_meter.serial_number'))
                       ->whereBetween('read_time',[$prevDate, $currDate])
                       ->where('smt_smart_meter.campus_id', $bill->campus_id)
                       ->groupBy('smt_meter_reading.smt_smart_meter_id')
                       ->get();
    
$metername = DB::table('smt_meter_reading')
                       ->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
                       ->select('smt_smart_meter.serial_number')
                       ->where('smt_smart_meter.campus_id', $bill->campus_id)
                       ->get();
    
$previous = 0;
$current = 0;
$usage = 0;
$serialno;

foreach ($meterprev as $data) {
    $previous = $data->total2;
}

foreach ($metercurr as $data) { 
    $current = $data->total1;
 }

foreach ($metername as $data) {
    $serialno = $data->serial_number;
}
    
$usage = $current - $previous;

您將需要使用以下效果嵌套您的foreach語句:

$usages = [];
foreach ($meterprev as $prevdata) {
    foreach ($metercurr as $currdata) {
        if ($prevdata->serial_number == $currdata->serial_number) {
            $usages = ($prevdata->total2 - $currdata->total1);
        }
    }
}

或者只是使用以下內容進行原始查詢:

$sqlQuery = "

Select (second.total - first.total) as 'usage'
(
SELECT 
    'SUM(actual_generation) as total', 'smt_smart_meter.serial_number'
FROM 
    smt_meter_reading
JOIN 
    smt_smart_meter ON smt_smart_meter.id = smt_meter_reading.smt_smart_meter_id
WHERE 
    smt_smart_meter.campus_id = $campus_id AND
    read_time BETWEEN CAST($prevdate AS DATE) AND CAST($currdate AS DATE)
GROUP BY
    smt_meter_reading.smt_smart_meter_id
) as first,
(
    SELECT 
    'SUM(actual_generation) as total', 'smt_smart_meter.serial_number'
FROM 
    smt_meter_reading
JOIN 
    smt_smart_meter ON smt_smart_meter.id = smt_meter_reading.smt_smart_meter_id
WHERE 
    smt_smart_meter.campus_id = $campus_id AND
    read_time BETWEEN CAST($prevdate AS DATE) AND CAST($currdate AS DATE)
GROUP BY
    smt_meter_reading.smt_smart_meter_id
) as second
WHERE
    first.smt_smart_meter.serial_number = second.smt_smart_meter.serial_number
";

$result = DB::select(DB::raw($sqlQuery));

這應該為您提供一系列用法。 這可能會更有效地完成或使用 eloquent 但希望這會為您指明正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM