Получили полиморфные отношения, подобные этому: Пользователь -> полиморф -> подписка с разных платформ. Игрушка, но рабочий пример:
class Polymorph
{
...
public function user()
{
return $this->belongsTo(User::class);
}
public function subscription()
{
return $this->morphTo();
}
public function isExpired()
{
return $this->subscription->isExpired(); // Checks an attribute
}
public function isActive()
{
return $this->subscription->isActive(); // Checks an attribute
}
...
}
class User{
...
public function poly()
{
return $this->hasOne(Polymorph::class);
}
...
}
И я делаю:
$poly = $user->poly
$poly->isExpired(); // One DB call
$poly->isActive(); // No DB call
// etc..
Похоже, что Ларавел кеширует вызов $this->subscription
. Я просматриваю журнал запросов при вызове этих методов, и для соответствующего объекта подписки есть только один SELECT
.
Я просмотрел документы, но не думаю, что нашел что-нибудь об этом. Это кешируется? Если да, то как это называется или есть документация, описывающая это?