2015-05-29 7 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 

Но на вашем Еогеасп, так как вы пытаетесь получить доступ к свойству, который не был загружен , вы делаете новый запрос, поэтому за кулисами 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() отлично подходит;

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