2015-05-29 75 views
1

我在模型上有一系列關係,這裏是其中之一。關係結果自動出來?

class Product extends Model{ 

    public function user(){ 
     return $this->belongsToMany('\App\User'); 
    } 
} 

我得到的所有行具有:

$data = Product::all() 

而這些都是通過像這樣循環:

foreach ($data as $value) { 
    var_dump($value->title); 
} 

我的理解是,如果你想爲關係型數據也出來了,您需要執行如下操作:

$data = Product::with('user')->get(); 

但是,即使沒有以上,只是在做一個全()我仍然可以訪問用戶:

foreach ($data as $value) { 
    var_dump($value->title->user); 
} 

這是爲什麼?

回答

4

關係結果會自動出來嗎?

沒有,基本上當你做

$data = Product::all(); 
foreach ($data as $value) { 
    var_dump($value->title); 
} 

你這樣做:

select * from products 

但隨後在你的foreach,因爲你正在試圖訪問未加載屬性,你正在做一個新的查詢,所以在幕後Laravel正在提取用戶。這代表了N + 1個查詢問題,如果你有25個產品,您將運行26個查詢(25 + 1):

select * from products 
select * from users where id = ? (x25) 

這就是爲什麼你有Eager Loading選項,

$data = Product::with('user')->get(); 
foreach ($data as $value) { 
    var_dump($value->title->user); 
} 

這樣做,你只運行兩個查詢

select * from products 

select * from users where id in (1, 2, 3, 4, 5, ...) 

因此,它是由你來選擇使用哪一種方法,如果你不是遍歷所有的產品的用戶,那麼預先加載是不必要的,平時all()是完美的;