Laravel. Sử dụng phạm vi () trong các mô hình có quan hệ


101

Tôi có hai mô hình liên quan: CategoryPost.

Các Postmô hình có một publishedphạm vi (phương pháp scopePublished()).

Khi tôi cố gắng lấy tất cả các danh mục với phạm vi đó:

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

Tôi gặp lỗi:

Gọi đến phương pháp không xác định published()

Thể loại:

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

Bài đăng:

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


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

}

Câu trả lời:


178

Bạn có thể làm điều đó nội tuyến:

$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 đó:

//all posts
$category->posts;

// published only
$category->postsPublished;

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

6
Ngẫu nhiên, nếu bạn muốn chỉ có được nơi bạn đã xuất bản bài viết:Category::whereHas('posts', function ($q) { $q->published(); })->get();
tptcat

2
@tptcat có. Cũng có thể Category::has('postsPublished')nằm trong trường hợp này
Jarek Tkaczyk

Câu hỏi rõ ràng, câu trả lời sạch sẽ!
Mojtaba Hn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.