php - 加入表格时如何使用 with()
问题描述
我有以下表格(仅包含相关字段):
设备
ID
名称
created_at
updated_at
设备报告
id
device_id
location
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());
}
}
模型的 latestReport 定义为:
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)'));
});
}
推荐阅读
- blockchain - 创建事务族并在本地运行它会给出无效参数错误锯齿
- npm - azure-pipelines.yaml:无法验证组织范围的提要
- c# - System.NullreferenceExeption:'对象引用未设置为对象 Xamarin.Froms 的实例
- php - CakePHP 3 - 在条件中使用 OR?
- javascript - javascript方法CharCodeAt()的时间复杂度
- javascript - 如何从 reactjs 中的回调函数呈现数据?
- python - 用漂亮的汤在网上刮 - Python
- laravel - Laravel echo 未从 Web 套接字接收事件
- javascript - 在为 Discord 服务器创建 BOT 时,如何在 discord.js 中“scanf()”和“printf()”用户的消息?
- asp.net - 在不使用控制器的 ViewBag 的情况下填充下拉列表,但它可以在 asp.net mvc 中工作,它是如何发生的?