gpt4 book ai didi

php - 同时连接表时如何使用 with()

转载 作者:行者123 更新时间:2023-11-29 09:51:47 27 4
gpt4 key购买 nike

我有下表(仅包含相关字段):

设备

ID
姓名
创建于
更新于

设备报告

ID
device_id
位置
创建于
更新于

我有一份包含许多已在运行的过滤器的报告,因此我想坚持采用 Eloquent 做事方式。这是 Controller 功能:

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 函数时确实能得到latestReport 吗?

最佳答案

我找到了我的问题。我应该使用“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)'));

});
}

关于php - 同时连接表时如何使用 with(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54658219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com