Laravel кеширует полиморфные вызовы? - PullRequest
0 голосов
/ 29 августа 2018

Получили полиморфные отношения, подобные этому: Пользователь -> полиморф -> подписка с разных платформ. Игрушка, но рабочий пример:

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.

Я просмотрел документы, но не думаю, что нашел что-нибудь об этом. Это кешируется? Если да, то как это называется или есть документация, описывающая это?

1 Ответ

0 голосов
/ 29 августа 2018

Краткий ответ на ваш вопрос: Да . Laravel кэширует результаты всех отношений после их загрузки, поэтому запросы на отношения не нужно запускать несколько раз.

Вы можете посмотреть GitHub source.

public function getRelationValue($key)
{
    // If the key already exists in the relationships array, it just means the
    // relationship has already been loaded, so we'll just return it out of
    // here because there is no need to query within the relations twice.
    if ($this->relationLoaded($key)) {
        return $this->relations[$key];
    }
    // If the "attribute" exists as a method on the model, we will just assume
    // it is a relationship and will load and return results from the query
    // and hydrate the relationship's value on the "relationships" array.
    if (method_exists($this, $key)) {
        return $this->getRelationshipFromMethod($key);
    }
}

Я предполагаю, что вы говорите о Laravel 5.2. Как видите, результаты отношений кэшируются в $this->relations элементе модели.

...