我有下表(仅包含相关字段):
id
名称
created_at
Updated_at
id
device_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”中却没有得到任何返回,但是当我在没有日期过滤器的情况下运行该页面时,它是正确的返回设备信息和最新报告类变量中的最新报告记录。
有人可以帮助我理解如何更改此代码,以便在我还调用lastReportBetween函数时可以获取最新报告吗?
答案 0 :(得分:1)
我发现了我的问题。我应该一直在使用“ whereHas()”而不是手动联接等等。
content://com.dropbox.android.FileCache/filecache/7b051751-3681-4ba1-8ce2-e70e8a0cae91