2014-10-03 19 views
56

Tôi có hai mô hình liên quan: CategoryPost.Laravel. Sử dụng phạm vi() trong các mô hình có quan hệ

Mô hình Post có phạm vi published (phương pháp scopePublished()).

Khi tôi cố gắng để có được tất cả các loại với phạm vi rằng:

$categories = Category::with('posts')->published()->get(); 

tôi nhận được một lỗi:

Call to undefined method published()

Thể loại:

class Category extends \Eloquent 
{ 
    public function posts() 
    { 
     return $this->HasMany('Post'); 
    } 
} 

bài viết:

class Post extends \Eloquent 
{ 
    public function category() 
    { 
     return $this->belongsTo('Category'); 
    } 


    public function scopePublished($query) 
    { 
     return $query->where('published', 1); 
    } 

} 

Trả lời

99

Đây là cách bạn làm điều đó inline:

$categories = Category::with(['posts' => function ($q) { 
    $q->published(); 
}])->get(); 

Bạn cũng có thể xác định một mối quan hệ:

public function postsPublished() 
{ 
    return $this->hasMany('Post')->published(); 
    // or this way: 
    // return $this->posts()->published(); 
} 

và sau đó sử dụng nó:

//all posts 
$category->posts; 

// published only 
$category->postsPublished; 

// eager loading 
$categories->with('postsPublished')->get(); 
+1

Ngẫu nhiên, nếu bạn muốn CHỈ nhận được nơi bạn đã xuất bản bài viết: 'Danh mục :: whereHas ('bài đăng', hàm ($ q) {$ q-> xuất bản d(); }) -> get(); ' – tptcat

+0

@tptcat có. Cũng có thể là "Category :: has ('postsPublished')' trong trường hợp này –

Các vấn đề liên quan