@mykolaim
PHP developer

Как работь с Repository в Laravel?

Не совсем понимаю как работать с репозиториями в Laravel, к примеру если у меня есть запрос вида:
DB::table('trips')
            ->join('routes', 'routes.trip_id', '=', 'trips.id')
            ->join('vehicles', 'trips.vehicle_id', '=', 'vehicles.id')
            ->where('trips.user_id', '=', $id)
            ->get(['trips.id','from', 'to', 'brand', 'model', 'start_at', 'end_at']);

Или если у меня прописаны все связи в моделях, то достаточно будет:
Trip:all();
  • Вопрос задан
  • 401 просмотр
Решения вопроса 2
@pantagruel964
Если есть связи, то и используйте их.
Trip::with('routes')->with('vehicles')->get();
Ответ написан
Комментировать
SerafimArts
@SerafimArts
Senior Notepad Reader
Отвечая на первый вопрос:
interface TripsRepository extends Repository
{
    public function getAllWithRoutesAndVechicles(): Collection;
}

//
// Не забыть зарегать интерфейс репозитория в контейнере и использовать DatabaseTripsRepository 
// в качестве реализации интерфейса по-умолчанию. А через контекстуальный биндинг подменять, если что.
// 1) $container->singleton(TripsRepository::class, DatabaseTripsRepository::class);
// 2) $container->when('somthing')->needs(TripsRepository::class)->give(...);
//
class DatabaseTripsRepository implements TripsRepository
{  
    // DI usage
    public function __construct(Trips $trips)
    {
        $this->trips = $trips;
    }

    public function getAllWithRoutesAndVechicles(): Collection
    {
        return $this->trips
            ->join('routes', 'routes.trip_id', '=', 'trips.id')
            ->join('vehicles', 'trips.vehicle_id', '=', 'vehicles.id')
            ->where('trips.user_id', '=', $id)
            ->get(['trips.id','from', 'to', 'brand', 'model', 'start_at', 'end_at']);
    }
}


Пример:
1) Репа: https://github.com/SerafimArts/SerafimArts/blob/ma...
2) Реализация: https://github.com/SerafimArts/SerafimArts/blob/ma...
3) Использование: https://github.com/SerafimArts/SerafimArts/blob/ma...
4) Пример в классической вариации через DataMapper (вместо ActiveRecord): www.laraveldoctrine.org/docs/1.3/orm/repositories

Отвечая на второй вопрос: Нет, чтобы так заработало надо принудительно прописать жадную загрузку этих связей для модели (поле with).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы