@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();
  • Вопрос задан
  • 407 просмотров
Решения вопроса 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).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы