Когда вы получаете доступ к отношению без скобок, как вы, Laravel сначала загрузит данные отношения из вашей базы данных, а затем сохранит результат во внутреннем свойстве под названием relations
. Каждый раз, когда вы получаете доступ к этому отношению (снова без скобок), Laravel будет читать данные оттуда.
$book->author; // First time will trigger a query
$book->author; // Second and every subsequent access will load from relations property
Это длится только в течение жизненного цикла запроса / ответа, на самом деле он не кэширует его в каком-либо внешнем хранилище, чтобы сохранить его между запросами, но вы можете сделать это самостоятельно, используя механизмы кэширования Laravel.
Если бы вы обращались к своему отношению с круглыми скобками, это было бы не так, Laravel вернул бы вам объект построителя запросов, который вы можете использовать для дальнейшего построения запроса. Это никак не кешируется.
$book->author()->where(...)->first();
Взгляните на метод Illuminate\Database\Eloquent\Concerns\HasAttributes::getRelationValue()
Laravel, который работает с отношениями загрузки, когда вы пытаетесь получить к нему доступ как свойство.