Как использовать с () при присоединении к таблице - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть следующие таблицы (только с соответствующими полями):

устройства

идентификатор
имя
создал_ат
updated_at

device_reports

id
device_id
location
create_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?

1 Ответ

0 голосов
/ 13 февраля 2019

Я разобрался в своей проблеме.Я должен был использовать «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)'));

            });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...