Отвечая на первый вопрос:
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).