首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel中为模型定义多个全局范围

问在Laravel中为模型定义多个全局范围
EN

Stack Overflow用户
提问于 2016-05-01 13:37:03
回答 1查看 1.8K关注 0票数 2

我有一个具有SoftDelete功能的Post模型和一个确定Post活动状态的 active 布尔字段。

代码语言:javascript
复制
class Post extends Model implements SluggableInterface
{
    use SoftDeletes;

    protected $primaryKey = 'post_id';
    .
    .
    .
 }

此外,post模型还有一个start_date字段,用于保存发布帖子的开始日期。

现在,除了非软删除的模型之外,我还想使用匿名GlobalScope Laravel 5.2来筛选和只获取活跃的帖子,并且他们的start_date是空的或小于现在的()。

为此,我将其添加到Post模型中:

代码语言:javascript
复制
protected static function boot()
        {
            parent::boot();

            static::addGlobalScope('active', function(Builder $builder){
                $builder->where('active',1);
            });

            static::addGlobalScope('scheduled', function(Builder $builder){
                $builder
                    ->whereNull('start_date')->orWhere(function ($query) {
                        $query->where('start_date', '<=', Carbon::now());
                    });
            });
        }

仅active全局范围就能正常工作,但是当我添加第二个名为scheduled的作用域时,返回所有记录,包括软删除和inActive模型。

有什么问题吗?我不明白

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-01 13:47:49

这是因为你在使用orWhere。在这些情况下,使用Laravel查看原始SQL非常有用,因为我打赌select语句如下所示:

SELECT * FROM table WHERE deleted_at IS NULL AND active=1 AND state_date IS NULL OR (start_Date <= now())

它将选择任何符合“一个或”标准的内容。

要解决这个问题,您应该让scheduled看起来像这样。

代码语言:javascript
复制
static::addGlobalScope('scheduled', function(Builder $builder) {
    $builder->where(function($query)) {
        $query->whereNull('start_date');
        $query->orWhere('start_date', '<=', Carbon::now());
    });
});

这将(希望)使您的查询看起来如下:

SELECT * FROM table WHERE deleted_at IS NULL AND active=1 AND (state_date IS NULL OR start_Date <= now())

这就是我认为你想要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36967286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档