Отслеживание истории транспортных средств и водителей - PullRequest
0 голосов
/ 17 сентября 2018

Я экспериментирую с отношениями в Laravel и не могу понять это.

У меня есть две таблицы users и vehicles.Пользователи могут управлять транспортным средством, а водителей часто заменяют.Для отслеживания этих изменений я создал таблицу history.Эта таблица содержит user_id, vehicle_id, start и end.Я хочу получить транспортное средство, на котором движется текущий пользователь, через таблицу истории.

class User extends model {
    public function vehicle() 
    {
        // return the current active vehicle for the user
        // through the History model.
        return $this->hasOne(History::class, 'user_id');
    }

    public function history() 
    {
        // return all the vehicles that the user has used
        // this currently returns the history rows, not the cars
        return $this->hasMany(History::class, 'user_id');
    }
}

class Vehicle extends model {
    public function user() 
    {
        // return the current active user
    }

    public function users() 
    {
        // return all the users that used this vehicle
    }
}

Если я выполню следующий метод в контроллере.

public function showUser()
{
    return User::findOrFail(1)->with('vehicle', 'history')->get()
}

Я хочу получить ответотформатирован так:

[
  0: {
    first_name: 'John',
    ...
    vehicle: {
      model: 'BMW ...'
    }
    history: {
      0: {
        model: 'BMW ...'
      }
      1: {
        model: 'Audi ...'
      }
      ...
    }
  }
]

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете добавить область запроса к своей модели истории, чтобы вернуть последнюю запись.

public function scopeLatest($query)
{
    return $query->orderBy('created_at', 'desc')->limit(1);
}

Затем вы можете получить это через ваши отношения

$user->history()->latest()->first()->vehicle;

Это, конечно, требует, чтобы у вас были отношения транспортных средств, определенные в вашем классе истории.

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