Octobercms Model eager loading

Wenn Models über eine Relationship miteinander verknüpft sind, kann im octobercms jeweils über das entsprechende Attribut auf diese "Kind"-Models zugegriffen werden.

Dabei kann man es october überlassen, diese models bei Bedarf zu laden. Ist man aber sicher, dass sie benötigt werden, so macht es Sinn diese über "eager loading" direkt zu Beginn zu laden.

Ich möchte jetzt hier nicht gross auf lazy- vs. eagerloading eingehen, Informationen dazu findet man in der Dokumentation.

Eager loading

$books = Book::with('author')->get();

foreach ($books as $book) {
    echo $book->author->name;
}

Aber auf einen Fall möchte ich speziell eingehen.

Eager loading mit einem Filter oder anderer Reihenfolge der Kindsmodels

Wenn die Reihenfolge der Models nicht automatisch festgelegt werden soll, kann dies in einer Funktion angepasst werden.

$books = Book::with([
    'author' => function($query) {
        $query->orderBy('created_at', 'desc');
    }
])->get();

Dies funktioniert ohne Probleme. Interessant wird es aber, wenn dies auf einem bestimmten Model geschehen soll und nicht auf einer collection von models.

$book = Book::find($id)->with('author')->get();

Obiger Code funktioniert nämlich nicht!

Stattdessen muss die Methode where verwendet werden (und danach first nicht vergessen, sonst gibts ein Array mit einem Resultat zurück).

$book = Book::where('id', $id)->with('author')->first();

Posted in Coding on Mar 04, 2021.

Schreib mir eine Nachricht