2016-12-19 133 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官方文檔https://laravel.com/docs/5.3/eloquent-relationships#eager-loading

+0

一個潛在的解決方案的鏈接永遠是受歡迎的,但請[在鏈接上添加上下文](http://meta.stackoverflow.com/a/8259/169503),以便您的用戶將擁有一些想法是什麼以及它爲什麼在那裏。如果目標網站無法訪問或永久離線,請始終引用重要鏈接中最相關的部分。考慮到_barely不僅僅是一個鏈接到外部網站_是一個可能的原因[爲什麼和如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 –