2014-02-03 3 views
0

Я застрял в этой теме в течение часа, я не вижу ничего, что мне не хватает. Я пытаюсь сделать ленивый нетерпеливый груз:Laravel lazy eager loading

$p = Project::all(); 
$p = $p->load('skills', 'user', 'comments', 'suggests'); 
var_dump($p->skills()); 

но выкидывает ошибку:

Call to undefined method Illuminate\Database\Eloquent\Collection::skills() 
+0

Вы имеете в виду сказать '' 'var_dump ($ p-> skills);' '' возможно? –

+0

@VictorBjelkholm then 'Undefined property: Illuminate \ Database \ Eloquent \ Collection :: $ skills' – revo

+0

Можете ли вы разместить код в своей модели проекта, где определены отношения? У вас есть список как «умение» вместо «навыков»? –

ответ

2

Просто не присваивайте $ p-> load() значение $ p.

$p = Project::all(); 
$p->load('skills', 'user', 'comments', 'suggests'); 
var_dump($p->skills()); 
0

Здесь вы пытаетесь load отношений на коллекции вместо Model, потому что $p содержит коллекция Models поэтому этот код не будет работать

$p = Project::all(); 
$p = $p->load('skills', 'user', 'comments', 'suggests'); 
var_dump($p->skills()); <-- $p is a collection not a Model 

Вы можете использовать цикл или использовать индекс в коллекции сп cify в Model, для которого вы хотите загрузить отношения как:

$p = Project::all(); 
$p = $p->load('skills', 'user', 'comments', 'suggests'); 

// Get the first Model from collection and load it's first 
// skill from collection of skills objects 
dd($p->first()->skills()->first()); 

Или использовать индекс, чтобы указать элемент в коллекции, как:

$skills = $p->get(2)->skills()->get(); // Get skills from second Project, 1st = 1 
dd($skills->get(2)); // Get second skill item from collection of skills 

Кроме того, вы можете запустить петлю

$p = Project::all(); 
foreach($p as $project) { 
    $skills = $project->skills()->get(); 
    dd($skills->first()); 
    dd($skills->get(2)) // 2nd item/skill, 1st = 1 (not 0) 

    // Or another loop 
    foreach($skills as $skill) { 
     // Use $skill->field_name 
    } 
}