Laravel. Utiliser scope () dans les modèles avec relation


102

J'ai deux modèles liés: Categoryet Post.

Le Postmodèle a une publishedportée (méthode scopePublished()).

Quand j'essaye d'obtenir toutes les catégories avec cette portée:

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

J'obtiens une erreur:

Appel à une méthode non définie published()

Catégorie:

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

Publier:

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


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

}

Réponses:


179

Vous pouvez le faire en ligne:

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

Vous pouvez également définir une relation:

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

puis:

//all posts
$category->posts;

// published only
$category->postsPublished;

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

6
Incidemment, si vous voulez UNIQUEMENT arriver là où vous avez publié des articles:Category::whereHas('posts', function ($q) { $q->published(); })->get();
tptcat

2
@tptcat oui. Peut également être Category::has('postsPublished')dans ce cas
Jarek Tkaczyk

Question propre, réponse propre!
Mojtaba Hn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.