Laravel. Gunakan scope () dalam model dengan relasi


102

Saya memiliki dua model terkait: Categorydan Post.

The Postmodel memiliki publishedlingkup (metode scopePublished()).

Saat saya mencoba mendapatkan semua kategori dengan cakupan itu:

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

Saya mendapatkan kesalahan:

Panggilan ke metode yang tidak ditentukan published()

Kategori:

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

Pos:

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


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

}

Jawaban:


179

Anda dapat melakukannya secara inline:

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

Anda juga bisa mendefinisikan relasi:

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

lalu:

//all posts
$category->posts;

// published only
$category->postsPublished;

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

6
Kebetulan, jika Anda ingin HANYA mendapatkan tempat Anda menerbitkan posting:Category::whereHas('posts', function ($q) { $q->published(); })->get();
tptcat

2
@ptcat ya. Juga dapat Category::has('postsPublished')dalam kasus ini
Jarek Tkaczyk

Pertanyaan bersih, jawaban bersih!
Mojtaba Hn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.