2016-09-15 7 views
2

Я просто хочу лучше понять, как Laravel's Eloquent/Model обрабатывает отношения.Способы взаимоотношений между Laravel, как ownTo всегда запрашивать базу данных?

Допустим, я определил отношения, где каждый пост имеет автора и класс Post имеет метод для получения объекта автор, связанный с ним:

public function author() { 
    return $this->belongsTo('App\User', 'author_id'); 
} 

Назвав Автор (ы) методом post теперь вернет автора на основе поля author_id сообщения. Мой вопрос: делает ли Laravel запрос каждый раз, когда используется метод? Будет ли следующий код запрашивать данные из db дважды?

<a href="{{ route('user',$post->author->slug) }}">{{ $post->author->name }}</a> 

ответ

2

Этот вопрос, с примерами, полностью задокументирован right here.

Который упоминает, что:

При доступе красноречивых отношений как свойства, данные отношения «ленивый загружен». Это означает, что данные отношения фактически не загружены до тех пор, пока вы не сначала получите доступ к свойству .

И что вы можете

При выполнении запроса, вы можете указать, какие отношения должны быть готовы загружены с помощью с помощью метода:


Так что, когда вы звоните $post->author вы делая запрос только один раз и повторно используя одни и те же данные из предыдущего запроса.

Однако, если бы вы сделали то же самое, допустим, несколько сообщений и зациклились на них, прося их автора, каждый запрос был бы новым запросом. Если для модели не было атрибута protected $with = ['author'], либо он был включен в запрос, чтобы загрузить его с нетерпением.

$post = App\Post::with('author')->find(2)->get();

Все данные будут стремиться загружены, и только один выполняемый запрос.

1

Из документации Laravel.

При доступе к связям с людьми как свойствам, отношение данных «лениво загружено». Это означает, что данные отношений не фактически загружены до вас сначала доступ к собственности.

Но тогда он будет загружаться каждый раз, когда вы получаете доступ к свойству, поэтому, чтобы избежать нескольких запросов (проблема N + 1), если вы знаете, что собираетесь получить доступ к этому свойству, загрузите его.

Смежные вопросы