2016-12-19 3 views
0

Laravel версия: 5,3Laravel Нетерпеливой Загрузка и динамически связывать отношения модели

В моем пользователя классе модели у меня есть метод, как:

public function hasOneRelation($model) 
{ 
    return $this->hasOne($model); 
} 

И тогда я называю этот метод, как показано ниже кода :

User::hasOneRelation('App\Client')->first(); 

У меня есть правильное значение, но есть ли проблема с N + 1 .....

ответ

0

У вас не должно быть проблем с N + 1, потому что вы не будете называть это как свойство модели. Это и просто держаться подальше от вызова этого в петле на вашей модели. Вы получаете вопрос N + 1, если вы должны были сделать что-то вроде:

//User Model 
public function contract() 
{ 
    return $this->hasOne(Contract::class); 
} 

//Controller 
public function index() 
{ 
    $users = User::all(); 

    return view('users.index', compact('users')); 
} 

//View 
<ul> 
@foreach($users as $user) 
    <li>{{$user->contract->type}}</li> 
@endforeach 
</ul> 

Загрузка отношения на каждой модели в цикле вместо отложенной загрузки это нравится:

//Controller 
public function index() 
{ 
    $users = User::with('contract')->get(); 

    return view('users.index', compact('users')); 
} 
1

Там нет никакой возможности нетерпеливо загружайте это динамическое соотношение, поэтому, если вы попытаетесь использовать это соотношение в цикле, да, вы в конечном итоге столкнулись с проблемой N + 1.

-1

Да, вы столкнулись с проблемой N + 1. Прочтите laravel official doc https://laravel.com/docs/5.3/eloquent-relationships#eager-loading

+0

Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, [добавьте контекст вокруг ссылки] (http://meta.stackoverflow.com/a/8259/169503), чтобы ваши друзья-пользователи какая-то идея, что это такое и почему она есть. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. Примите во внимание, что быть более чем ссылкой на внешний сайт_ является возможной причиной [Почему и как удаляются некоторые ответы?] (Http://stackoverflow.com/help/deleted-answers). –