Bonjour à tous, je suis en train de monter un petit système qui fonctionne avec Laravel et je souhaiterais résoudre un problème assez simple. J'ai des Utilisateurs, et des Articles. Chaque Article possède un champ published qui permet de dire, comme son nom l'indique, si l'article est publié ou non.

J'aurais aimé utiliser un système de "Global Scopes" afin de trier ces articles. Ainsi, si un utilisateur n'est pas l'auteur d'un article, il ne peut tout simplement pas soupçonner son existence.

Jusque là, tout va bien, mon Global Scope fonctionne très bien, mais je n'ai aucune idée de comment faire pour lui dire de ne l'appliquer que si la personne n'est pas l'auteur. Quelqu'un aurait une idée?

class PublishedScope implements ScopeInterface {
    public function apply(Builder $builder, Model $model)
    {
            $builder->where('published',true);
    }
}

En gros, ce que j'aimerais si j'étais dans un rêve, c'est ajouter quelque chose dans cette fonction apply, une condition... Mais aucune idée de comment m'y prendre...

Si quelqu'un a une idée, ce serait super!

Merci à tous :)

3 réponses


Dans ton model tu ajoute une méthode

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

Et lorsque tu veux tes articles publiés tu fais

Post::published()

Pour le global scope je n'ai jamais essayé par contre

Bonjour, merci pour ta réponse, enfait, je me suis rendu compte que ma question était à moitié bête, et je vais effectivement utiliser les petites scopes. Ce que j'aurais aimé, c'est que les articles écrits par un auteur connecté apparaissent qu'ils soient publiés ou non...

Mais ça devrait être gérable dans cette méthode scopePublished.. Que je devrait appeler à chaque fois que j'affiche des articles (c'est pour ça que m'était venu à l'idée d'utiliser des global Scopes...)

Merci pour ta réponse en tous cas!

Au final, j'ai fait comme ça pour le globalScope, et ça m'a donné exactement le résultat que je recherchais:

class PublishedScope implements ScopeInterface {
    public function apply(Builder $builder, Model $model)
    {
            if(Auth::user()){
                    $builder->where('published',true)->orWhere('articles.user_id',Auth::user()->id);
            }
            else{
                $builder->where('published',true);
            }
    }
}