У меня есть следующие классы (здесь упрощены) в моей модели Laravel 5.7:
АВТОМОБИЛЬ.PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Vehicle extends Model
{
public function journeys()
{
return $this->hasMany('App\Journey');
}
}
ПУТЕШЕСТВИЕ PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Journey extends Model
{
public function vehicle()
{
return $this->belongsTo('App\Vehicle');
}
public function users()
{
return $this->belongsToMany('App\User');
}
}
USER.PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function journeys()
{
return $this->belongsToMany('App\Journey');
}
}
У меня есть промежуточная таблица (Journey_user) между пользователями и поездками (см. Прилагаемую схему).
Я могу легко получить информацию обо всех поездках, совершенных конкретным пользователем. Но как я могу получить все автомобили, используемые конкретным пользователем? Стандартный метод hasManyThrough не работает из-за связи «многие ко многим» между пользователями и путешествиями.
Спасибо за вашу помощь!
Я не проверял это. Однако должна быть возможность получить все vehicles
, перебрав все user
journeys
, создав массив транспортных средств и вернув его как collection
.
Это можно добавить к вашему контроллеру модели User.php
:
/**
* Get all vehicles which user has used
*
*/
public function vehicles()
{
$vehicles = [];
$this->journeys()
->each(function ($journey, $key) use (&$vehicles) {
$vehicles[] = $journey->vehicle;
});
return collect($vehicles);
}
Здесь мы создаем пустой массив. Затем мы перебираем все пути пользователей (передавая массив $vehicles
в качестве ссылки для его обновления).
Мы используем метод сбора each()
, чтобы перебрать каждый journey
. Мы создаем новую запись в массиве $vehicles
, добавляя vehicle
.
Наконец, мы возвращаем все vehicles
как коллекцию.
Мы можем использовать это в нашем приложении так:
User::find($id)->vehicles();
Примечание: вы можете вернуть это как атрибут аксессуар, изменив имя функции на setVehiclesAttribute()
. Это позволит вам получить доступ к полю транспортного средства, например User::find($id)->vehicle
.
Добро пожаловать, @Mateo!
Кажется, что Транспортное средство - это свойство Путешествий, поэтому лучше всего пройти через эти отношения. Если вам нужен метод легкого доступа к Транспортным средствам, используемым пользователем на протяжении его путешествий, я бы создал какой-то репозиторий или службу для этой логики ... нет в модели пользователя.