I have a model School wich has a belongsToMany relation:
JavaScript
x
class School extends Model
{
protected $fillable = [
"url",
"title",
"is_own",
];
public function events()
{
return $this->belongsToMany(Event::class, "event_school");
}
}
How I can order school by event start_at field? For example, can I do like this?
JavaScript
School::whereHas("events")
->with([
"events" => function ($query) {
$query->latest("start_at")->limit(4);
},
"events.address"
])->orderBy("events.start_at")->paginate(4);
Is it posible? Please tell me how to implement this. thanks.
UPD: I try with join, yes it works but not properly:
JavaScript
Schools::whereHas("events")
->select("schools.*")
->join("event_school", "schools.id", "=", "event_school.school_id")
->join("events", function ($join) {
$join->on("events.id", "=", "event_school.event_id")
->whereDate("events.start_at", ">=", Carbon::now()->format("Y-m-d"))
->limit(4);
})
->join("addresses", "events.address_id", "=", "addresses.id")
->groupBy("schools.id")
->orderBy("events.start_at")
I’l geting all events. ->whereDate("events.start_at", ">=", Carbon::now()->format("Y-m-d"))
not work, and not load addresses
Advertisement
Answer
Solution:
JavaScript
School::whereHas("events")
->select("schools.*")
->join("event_school", "schools.id", "=", "event_school.school_id")
->join("events", function ($join) {
$join->on("events.id", "=", "event_school.event_id");
})
->with([
"events" => function ($query) {
$query->whereDate("start_at", ">=", Carbon::now()->format("Y-m-d"))
->orderBy("start_at", "asc")
->limit(4);
},
"events.address"
])
->groupBy("schools.id")
->orderBy("events.start_at");