加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Laravel否定了本地范围

发布时间:2020-12-14 19:44:30 所属栏目:大数据 来源:网络整理
导读:我正在为我的项目使用laravel 5.2我刚刚实现了一个本地范围(为简单起见,让我们使用laravel docs示例 – https://laravel.com/docs/master/eloquent#local-scopes) ?phpnamespace App;use IlluminateDatabaseEloquentModel;class User extends Model{ /**
我正在为我的项目使用laravel 5.2我刚刚实现了一个本地范围(为简单起见,让我们使用laravel docs示例 – https://laravel.com/docs/master/eloquent#local-scopes)

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * Scope a query to only include popular users.
     *
     * @return IlluminateDatabaseEloquentBuilder
     */
    public function scopePopular($query)
    {
        return $query->where('votes','>',100);
    }

}

我打电话:

$users = AppUser::popular()->get();

它就像一个魅力

是否可以对范围进行否定?

$users = AppUser::Notpopular()->get();

或者我必须手动实施上述范围的否定?如果是这样,有更好的方法吗?

先感谢您!

解决方法

它不可能(技术上是,但它需要更多的代码)来创建一个本地范围,否定另一个本地范围而不实现另一个范围方法.但是,可以从另一个范围中的一个范围重用否定的标准.

以下代码应该可以解决问题:

public function scopeNotPopular($query) {
  $query->whereNotIn($this->getKeyName(),function($q) {
    $q->select($this->getKeyName())->from($this->getTable());
    $this->scopePopular($q);
  });
}

此代码使用whereNotIn约束从另一个范围应用否定约束.它允许您重用约束逻辑,而不是在两个不同的位置实现原始和否定版本.虽然这些代码量似乎与文档中的示例范围相当,但是对于更复杂的约束更有意义.

请记住,虽然它允许代码重用,但从性能的角度来看,将要应用的SQL查询可能是次优的.它使用子选择来标识应从结果集中排除的行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读