簡體   English   中英

還聯接表時如何使用with()

[英]How use with() when also joining a table

我有下表(僅包含相關字段):

設備

ID
名稱
created_at
的updated_at

device_reports

ID
設備ID
位置
created_at
的updated_at

我有一個包含多個過濾器的報告,該報告已經在起作用,所以我想堅持用雄辯的方式做事。 這是控制器功能:

public function devices(Request $request)
{
    $devicesQuery = Device::with(['latestReport']);

    if ($request->ajax())
    {

        if($request->input('start') && $request->input('start')!='')
        {
            $start_date = date('Y-m-d', strtotime($request->input('start')));
            $end_date =  date('Y-m-d', strtotime($request->input('end')));
            $devicesQuery = $devicesQuery->lastReportBetween($start_date,$end_date);
        }

        $devices = $devicesQuery->paginate(10);

        return Response::json(View::make('devices/table', array('devices' => $devices))->render());
    }
}

該模型的最新報告定義為:

public function latestReport()
{
    return $this->hasOne('App\Models\DeviceReport')->latest();
}

模型的函數lastReportBetween定義為:

public function scopeLastReportBetween($query, $start, $end)
{
    $query = $query->join('device_reports AS dr', 'dr.device_id', '=', 'devices.id');
    $query = $query->where('dr.id', '=', DB::raw('(SELECT max(dr2.id) FROM device_reports AS dr2 WHERE dr2.device_id = devices.id)'));
    $query = $query->where(DB::raw("(IFNULL(dr.gps_time, dr.created_at))"), '>=', DB::raw("STR_TO_DATE('".$start."', '%Y-%m-%d')"));
    $query = $query->where(DB::raw("(IFNULL(dr.gps_time, dr.created_at))"), '<=', DB::raw("STR_TO_DATE('".$end."', '%Y-%m-%d')"));

    return $query;
}

在選擇開始/結束日期的情況下運行上述命令時,我得到了正確的記錄,但是在“ latestReport”中卻沒有得到任何返回,但是當我在沒有日期過濾器的情況下運行頁面時,它會正確地返回設備信息和LatestReport類變量中的最新報告記錄。

任何人都可以幫助我了解如何更改此代碼,以便當我還調用lastReportBetween函數時可以獲取最新報告嗎?

我發現了我的問題。 我應該一直在使用“ whereHas()”而不是手動聯接等等。

public function scopeLastReportBetween($query, $start, $end)
{
    return $query->whereHas('latestReport', function($reportsQuery) use ($start, $end)
            {
                $reportsQuery->whereBetween('created_at', [$start, $end])
                    ->where('device_reports.id', '=', DB::raw('(SELECT max(dr2.id) FROM device_reports AS dr2 WHERE dr2.device_id = device_reports.device_id)'));

            });
}

暫無
暫無

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

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