Laravel版本:5.3Laravel預先加載和動態綁定模型關係
在我用戶模型類我有這樣的方法:
public function hasOneRelation($model)
{
return $this->hasOne($model);
}
然後我把這個方法就像下面的代碼:
User::hasOneRelation('App\Client')->first();
我得到了正確的值,但是有沒有N + 1問題.....
Laravel版本:5.3Laravel預先加載和動態綁定模型關係
在我用戶模型類我有這樣的方法:
public function hasOneRelation($model)
{
return $this->hasOne($model);
}
然後我把這個方法就像下面的代碼:
User::hasOneRelation('App\Client')->first();
我得到了正確的值,但是有沒有N + 1問題.....
您不應該在此處遇到任何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'));
}
沒有辦法急於加載這種動態關係,所以如果你試圖在循環中使用這種關係,是的,你最終會遇到N + 1問題。
是的,你只是面對N + 1問題。閱讀laravel官方文檔https://laravel.com/docs/5.3/eloquent-relationships#eager-loading
一個潛在的解決方案的鏈接永遠是受歡迎的,但請[在鏈接上添加上下文](http://meta.stackoverflow.com/a/8259/169503),以便您的用戶將擁有一些想法是什麼以及它爲什麼在那裏。如果目標網站無法訪問或永久離線,請始終引用重要鏈接中最相關的部分。考慮到_barely不僅僅是一個鏈接到外部網站_是一個可能的原因[爲什麼和如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 –