首页 > 其他分享 >Laravel的 Eloquent ORM 中Scopes

Laravel的 Eloquent ORM 中Scopes

时间:2024-05-15 10:30:54浏览次数:18  
标签:Laravel Scopes use 作用域 App Eloquent User 全局

在 Laravel 的 Eloquent ORM 中,Scopes(作用域)是一种用于封装数据库查询逻辑的便捷方式。Scopes 可以帮助你在模型中定义常用的查询逻辑,并使其在需要时更易于重用和调用。

Scopes 有两种类型:全局作用域(Global Scopes)和局部作用域(Local Scopes)。

局部作用域(Local Scopes)

局部作用域是一种在模型中定义的查询方法,你可以通过调用这个方法来应用特定的查询逻辑。

定义局部作用域

你可以在模型中定义一个局部作用域方法。局部作用域方法的名称应该以 scope 开头,并且在调用时不需要包括 scope 前缀。

例如,在 User 模型中定义一个 scopeActive 局部作用域:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // 定义一个局部作用域来筛选激活的用户
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

使用局部作用域

使用局部作用域时,只需在查询中调用不带 scope 前缀的方法:

use App\Models\User;

// 获取所有激活的用户
$activeUsers = User::active()->get();

你还可以将多个作用域链式调用:

// 定义另一个作用域来筛选管理员用户
public function scopeAdmin($query)
{
    return $query->where('role', 'admin');
}

// 获取所有激活的管理员用户
$activeAdmins = User::active()->admin()->get();

全局作用域(Global Scopes)

全局作用域是你希望在模型的所有查询中自动应用的查询逻辑。定义全局作用域时,你需要创建一个实现 Scope 接口的类,并在模型中注册该作用域。

定义全局作用域

创建一个全局作用域类:

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', 1);
    }
}

注册全局作用域

在模型中注册全局作用域:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Scopes\ActiveScope;

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new ActiveScope);
    }
}

使用全局作用域

全局作用域会自动应用于所有的查询:

use App\Models\User;

// 获取所有激活的用户
$users = User::all(); // 仅返回激活的用户

如果你想在特定查询中忽略全局作用域,可以使用 withoutGlobalScope 方法:

use App\Models\User;
use App\Scopes\ActiveScope;

// 获取所有用户,包括未激活的用户
$allUsers = User::withoutGlobalScope(ActiveScope::class)->get();

总结

  • 局部作用域:在模型中定义以 scope 开头的方法,用于封装特定的查询逻辑,调用时省略 scope 前缀。
  • 全局作用域:创建一个实现 Scope 接口的类,并在模型中注册该作用域,自动应用于所有查询。

使用作用域可以使你的查询逻辑更加清晰、可重用,并且更易于维护。

标签:Laravel,Scopes,use,作用域,App,Eloquent,User,全局
From: https://www.cnblogs.com/laraveler/p/18193307

相关文章

  • Laravel实战笔记
    Laravel中默认时间格式为:"updated_at":"2024-05-14T03:16:43.000000Z"Date要修改Laravel模型中updated_at字段的输出格式,可以通过以下两种方式实现:使用toDateString()方法:$user=User::find(1);$updatedAt=$user->updated_at->toDateString();//输出:"2024......
  • Laravel Model中的$appends
    protected$appends是Laravel模型中的一个属性,用于指定哪些虚拟属性(Accessor)应该被包含在模型的数组或JSON表示中。虚拟属性是在模型中定义的,通过使用Accessors和Mutators来访问和修改模型属性的值。这些虚拟属性不会存储在数据库中,但可以通过模型实例进行访问和操作......
  • laravel,webman,hyperf,thinkphp推荐哪一个?
    2024年5月11日14:11:45laravelwebmanhyperfthinkphp流行程度国内流行,欧洲特别是法国,美国,日本很多使用主要在国内流行,少量国外使用主要国内流行,少量国外使用国内流行,国外俄罗斯有使用性能fpm多进程模式,性能一般,偏差同步阻塞多进程模式,性能很好web第一梯队协......
  • Laravel 实现自定义资源路由
    Laravel如何实现自定义资源路由最近在开发过程中,发现总有一些路由需要重复定义,比如切换状态,导出,回收站啊之类的。如果使用Laravel自带的资源路由方法,还不足以满足重复劳动得过程。所以是否有方法可以自定义项目得资源路由呢?在Laravel中,资源路由一般有两种服务端渲染Route:......
  • Laravel Schedule 中的 dailyAt 是如何工作的
    LaravelSchedule中的dailyAt是如何工作的业务逻辑中通过dailyAt​指定了一个每天都需要执行的定时任务:$schedule->call(function(){//业务逻辑})->dailyAt('14:29');‍​Illuminate\Console\Scheduling\ManagesFrequencies​中的dailyAt​方法,最终是生成......
  • PHP框架Laravel+Vue3+前后端分离开发模式+实战项目
    1、本实战项目采用前后端分离的开发模式,前端框架vue3,后端框架laravel10。所谓的前后端分离的开发,就是有别于利用cookie,session的基于会话机制的开发模式;前后端分离的开发模式是基于jwt的开发模式,也就是说后端的接口数据不仅可以支持web页面,也可以支持微信小程序,公众号,app等移动端......
  • laravel 监听数据库查询
    laravel监听数据库查询DB::listen在Laravel框架中,DB::listen是一个监听器,用于监听数据库查询。这段代码注册了一个闭包(匿名函数)作为监听器,当执行数据库查询时,闭包会被调用,并且传递一个包含查询信息的对象作为参数。在这个例子中,传递给闭包的参数是$query,它包含了执行的SQL语句......
  • 快速理解Laravel容器(IOC、DI、Provider、Contract)
    源码理解思维的提升分享一些个人见解。Laravel里面的某些概念,就像魔术一样,看起来很厉害,当知道魔术怎么变的,就会认为也不过如此。所以不必感觉Laravel里有些概念难以理解。应当抛除被框架约束思维的枷锁,用PHP设计的角度去思考,关注大概,而不是在在框架层面逐行磨叽。毕竟源码那么......
  • Laravel Eloquent Paginator 一种优雅的重新修改分页数据的方法
    需求如何将分页器数据内的数据进行处理后再塞回去解决分页器数据是一个Collection,使用transform方法进行处理$paginator=$this->items()->where('position','=',null)->paginate(15);$paginator->getCollection()->transform(function($value){//Yourcodehe......
  • 10 个 Laravel Eloquent 中的隐藏特性你知道几个
    Laravel是一个功能丰富的框架。但是,你无法在官方文档中找到所有可用的功能。以下就是你可能不知道的一些功能。1.获取原始属性当你修改了一条Eloquent记录后,你可以用getOriginal()来获取原来的属性。$user=App\User::first();$user->name;//John......