красноречивые результаты кэша как $ book-> author? - PullRequest
0 голосов
/ 28 августа 2018

Выдает ли eloquent один и тот же запрос несколько раз, когда я делаю:

$author = $book->author;
$author = $book->author;

или это кеширует сам результат? Если да, то как долго?

Ответы [ 3 ]

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

Когда вы загружаете отношение с Eloquent, оно кэширует его в свойство с именем relations.

Поэтому, если вы делаете следующее:

$author = $book->author;

И вы посмотрите на $book переменную с dd($book);, вы увидите что-то вроде этого:

Book {#312 ▼
  #appends: array:2 [▶]
  #fillable: array:7 [▶]
  #hidden: array:6 [▶]
  #with: array:2 [▶]
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:11 [▶]
  #original: array:11 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #dispatchesEvents: []
  #observables: []
  #relations: array:1 [▼
    "author" => Author {#441 ▼
      #appends: array:1 [▶]
      #fillable: array:9 [▶]
      #hidden: array:4 [▶]
      #with: array:2 [▶]
      #withCount: array:1 [▶]
      #connection: "mysql"
      #table: null
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:13 [▶]
      #original: array:13 [▶]
      #changes: []
      #casts: []
      #dates: []
      #dateFormat: null
      #dispatchesEvents: []
      #observables: []
      #relations: array:2 [▶]
      #touches: []
      +timestamps: true
      #visible: []
      #guarded: array:1 [▶]
    }
  ]
  #touches: []
  +timestamps: true
  #visible: []
  #guarded: array:1 [▶]
}

Если вы хотите перезагрузить отношения, вы должны использовать свежий метод:

$author = $book->fresh()->author;
0 голосов
/ 28 августа 2018

Когда вы получаете доступ к отношению без скобок, как вы, 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, который работает с отношениями загрузки, когда вы пытаетесь получить к нему доступ как свойство.

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

Загрузка Laravel один раз для каждого экземпляра класса. Если вы хотите перезагрузить - напишите $book->load('author'). Это сохранить для отношения модели. Читать дальше https://laravel.com/docs/5.6/eloquent-relationships#eager-loading

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...