2013-12-07 3 views
1

Моей модель BookLaravel - ограничить на нетерпеливых загруженных belongsTo отношениях

public function author() 
{ 
    return $this->belongsTo('Author'); 
} 

Я хочу, чтобы все книги, которые имеют автор, у которых есть столбец is_published == 1.

Так что я попытался это:

Book::with(['author' => function($query){ 

    $query->where('is_published', '=', '1'); 

}]); 

Это работает, но на самом деле я получаю только книги, в которых некоторые книги имеют прикрепленную модель автора, а некоторые нет!

Итак, я попытался это:

Book::with(['author' => function($query){ 

    $query->where('is_published', '=', '1'); 

}])->has('author'); 

Но я получаю эту ошибку:

Has method invalid on "belongsTo" relations

Как я могу быть уверен, что мое ограничение на внешнюю таблицу уменьшает свой окончательный набор данных без нужно ли проходить через мои данные и проверять существование автора? Благодарю.

ответ

0

Проблема заключается в том, что жадная загрузка не использует SQL JOIN (что я знаю), если вы над головой http://laravel.com/docs/eloquent#eager-loading вы увидите пример:

select * from books 

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

Это не позволяет ограничение автора существующий.

Для этого требуется JOIN, если вы хотите сделать это эффективно (я предполагаю, следовательно, с нетерпением загрузка).

Соответствующие Laravel Документация: http://laravel.com/docs/queries#joins

0

Заменить has('author') с whereNotNull('author_id').

+0

это не работает, потому что author_id никогда не является нулевым. У нас всегда есть author_id. – phirschybar

1
Book::whereHas('author' , function($query){ 
    $query->where('is_published', '=', '1'); 
})->get(); 

Используйте это для меня.

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