К сожалению, мы могли бы просто использовать метод union
для достижения этой цели, но, похоже, это не работает для hasManyThrough
отношений.
В любом случае, я думаю, Eloquent
отношения не подразумеваются использоваться для достижения такого конкретного c запроса.
Вместо этого вы можете использовать Eloquent
области для достижения этой цели.
Итак, основываясь на ответе @Saengdaet, мы можем написать два отношения и затем объединить их с scope
:
(Кстати: я не знаю, почему вы сказали, что его код выдал ошибку ...)
class Delivery extends Model
{
public function places()
{
return $this->hasMany(Place::class);
}
public function outboundTrips()
{
return $this->hasManyThrough(
Trip::class,
Place::class,
"delivery_id", // Foreign key on places table
"departure_place_id", // Foreign key on trips table
);
}
public function inboundTrips()
{
return $this->hasManyThrough(
Trip::class,
Place::class,
"delivery_id", // Foreign key on places table
"arrival_place_id", // Foreign key on trips table
);
}
public function scopeTrips($query)
{
$deliveriesWithTrips = $query->with(['outboundTrips', 'inboundTrips'])->get();
$trips = [];
$deliveriesWithTrips->each(function ($elt) use (&$trips) {
$trips[] = $elt->inboundTrips->merge($elt->outboundTrips);
});
return $trips;
}
}
А теперь, чтобы получить все поездки для данной доставки, вы просто пишете:
Delivery::where('id', $id)->trips();