2016-05-18 4 views
3

У меня есть сообщения модели, связанная с Разделом модели, которые зависят от дополнительного условия для работы:Laravel belongsTo с условием и ревностными нагрузками

<?php 
class Post extends Base 
{ 
    public function section() 
    { 
     return $this->belongsTo('App\Models\Section', 'id_cat')->where('website', $this->website); 
    } 
} 

Когда я хочу, чтобы извлечь сообщение и получить это связанно раздел, я могу это сделать, как:

$post = Post::first(); 
echo $post->section->name; // Output the section's name 

Однако при попытке получить раздел с помощью нетерпеливых нагрузок:

Post::with(['section'])->chunk(1000, function ($posts) { 
    echo $post->section->name; 
}); 

Laravel бросить следующее исключение:

PHP error: Trying to get property of non-object 

Когда я делаю отладку объекта Post возвращенного выше нетерпеливого запрос нагрузки, я замечаю, что section отношений null. Обратите внимание, что он работает нормально, если я удаляю условие из ассоциации belongsTo.

У вас есть идеи, почему это происходит?

+0

Прежде всего, вы не пишете 'где' в определении своих отношений. Это просто отображение отношения. 'where' используется, когда вы запрашиваете это отношение –

ответ

0

Как указано в моем комментарии, where не должен использоваться в определении отношений. Таким образом, ваше определение отношения хорошо только с

public function section() 
{ 
    return $this->belongsTo('App\Models\Section', 'id_cat'); 
} 

и вы можете нетерпеливый нагрузку таким образом (не выдавая точный запрос с куском и т.д.)

Post::with(['section' => function ($query) use ($request) { 
    $query->where('website', $request['website']) 
}])->get()->first(); 

т.е. когда вы передаете переменную website в запросить или использовать любую другую переменную аналогичным образом.

Надеюсь, это объяснит. Пожалуйста, добавьте комментарии, если что-то неясно.

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