Порядок по полю во многих отношениях ко многим (Laravel) - PullRequest
2 голосов
/ 05 ноября 2019

У меня есть модель Школа, у которой есть отношение ownToMany:

class School extends Model
{
    protected $fillable = [
        "url",
        "title",
        "is_own",
    ];

    public function events()
    {
        return $this->belongsToMany(Event::class, "event_school");
    }
}

Как я могу заказать школу по полю start_at события? Например, могу ли я сделать так?

School::whereHas("events")
    ->with([
        "events" => function ($query) {
            $query->latest("start_at")->limit(4);
        },
        "events.address"
    ])->orderBy("events.start_at")->paginate(4);

Это возможно? Подскажите пожалуйста как это реализовать. спасибо.

UPD: Я пытаюсь с объединением, да, это работает, но не правильно:

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")

Я получаю все события. ->whereDate("events.start_at", ">=", Carbon::now()->format("Y-m-d")) не работают и не загружаются адреса

1 Ответ

1 голос
/ 05 ноября 2019

Решение:

    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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...