Laravel有很多难题

时间:2019-10-10 19:10:23

标签: laravel laravel-5 eloquent

static void Main(string[] args) { Car c1 = new Car("Toyota", "Model", "1"); Console.WriteLine(c1.engine.engineNumber); } public class Car { public class Engine { public string engineNumber { get; private set; } internal protected Engine(string engineNumber) { this.engineNumber = engineNumber; } } public string name { get; private set; } public string model { get; private set; } public Engine engine { get; private set; } public Car(string name, string model, string engineNumber) { this.name = name; this.model = model; this.engine = new Engine(engineNumber); } } 模型设置了以下关系:

Comment

function replies(){ return $this->hasMany('App\Reply', 'comment_id', 'id')->whereNotNull('replies.status'); } 需要返回答复,即使当前登录用户的状态为null而不是其他用户的状态也是如此。其他人应该只看到已设置状态的回复(除非他们是所有者,在这种情况下,应向他们显示)

我很难把这个逻辑加进去;任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您可以查看模型引导范围,在这种情况下,您需要在App\Reply模型类内添加全局范围:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('guest_filter_for_comments', function (Builder $builder) {
        return $builder->when(\Auth::check() == false, function ($query) {
            return $query->whereNotNull('replies.status');
        });
    });
}

当您想在需要时禁用过滤器时,只需使用Comment::replies()->withoutGlobalScopes()即可在未经身份验证时检索未过滤的结果。

顺便说一句,您可以使用相同的逻辑过滤掉与用户相关的注释。当您为经过身份验证的用户调用Comment::all()时,如果您对Comment类使用了引导作用域,它将自动过滤掉相关的注释。

参考:

https://laravel.com/docs/5.8/eloquent#global-scopes(匿名全局范围) https://laravel.com/docs/5.8/queries#conditional-clauses