Laravel模型静态方法实现方法详解

前端 潘老师 4周前 (03-25) 21 ℃ (0) 扫码查看

在Laravel开发中,模型静态方法的运用十分广泛,它能为业务层提供便捷的调用方式。接下来,咱们详细探讨一下Laravel模型静态方法的多种实现方式及其特点。

一、Laravel模型静态方法概述

在Laravel框架里,模型静态方法允许开发者通过链式调用构造器方法,给外层业务层提供方便的静态调用接口。这在进行数据查询、处理等操作时,极大地简化了代码,提高了开发效率。下面具体看看实现模型静态方法的几种途径。

二、静态方法的实现方式

(一)使用static关键字(优先推荐)

  1. 原理讲解
    static关键字是从PHP5.3版本开始引入的特性,它实现了后期静态绑定。简单来说,这意味着在运行时,static会根据调用的情况来决定指向哪个类。要是存在类继承关系,它代表的就是调用时的类,这个类既可能是子类,也可能是父类。在Laravel模型中,如果模型里有查询作用域方法,我们可以使用static::query()来调用;要是没有查询作用域方法,那就直接用static::来调用相关方法。
  2. 代码示例
class User extends Model 
{
   // 指定关联的数据表
   protected $table = 'users';

   /**
    * 定义查询作用域,筛选出非删除状态的用户
    */
   public function scopeActiveStatus($query)
   {
     return $query->whereIn('status', [0, 1]);
   }

   /**
    * 根据用户名称查询用户数量
    */
   public static function countByName($name): int
   {
      // 直接使用static::activeStatus()会报错,因为需要通过查询构造器来调用查询作用域
      return static::query()->activeStatus()->where('name', $name)->count();
   }

   /**
    * 根据ID数组获取用户数量
    */
   public static function countById($ids): int
   {
      return static::whereIn('id', $ids)->count();
   }
}

在这个例子里,countByNamecountById方法都借助static关键字来调用查询构造器,进而实现相应的查询功能。

(二)使用self关键字调用

  1. 原理讲解
    self关键字和static有所不同,它固定指向定义了该方法的类。当存在类继承关系,子类继承父类并且覆盖了父类的方法时,使用self调用得到的依然是父类的方法。
  2. 代码示例
class User extends Model 
{
   // 指定数据表
   protected $table = 'users';

   /**
    * 筛选非删除状态的用户
    */
   public function scopeActiveStatus($query)
   {
     return $query->whereIn('status', [0, 1]);
   }

   /**
    * 根据名称查询用户数量
    */
   public static function countByName($name): int
   {
      // 不建议直接使用self::activeStatus()调用,虽然也能运行,但最好通过查询构造器实例调用查询作用域
      return self::query()->activeStatus()->where('name', $name)->count();
   }

   /**
    * 根据ID数组获取用户数量
    */
   public static function countById($ids): int
   {
      return self::whereIn('id', $ids)->count();
   }
}

从代码中可以看出,self的使用方式和static类似,但在继承场景下,二者的表现存在差异。

(三)使用(new static())(不推荐)

  1. 原理讲解
    (new static())这种方式实际上是实例化当前类的对象,在继承关系上,它和static一样,指向调用时的类。不过,这种做法并不推荐。因为在模型静态方法里使用它,会额外增加内存开销,而且这种使用方式与模型静态方法的使用场景不太契合。
  2. 代码示例
class User extends Model 
{
   // 关联数据表
   protected $table = 'users';

   /**
    * 根据ID数组获取用户信息
    */
   public static function countById($ids): array
   {
      return (new static())->whereIn('id', $ids)->get()->toArray();
   }
}

虽然这种方式能实现功能,但考虑到性能和使用场景,在实际开发中应尽量避免使用。

三、static和self的异同点

当类之间不存在继承关系时,staticself的表现完全一样,在这种情况下,二者可以相互替换使用。然而,一旦存在继承关系,情况就有所不同。当子类继承父类并实现了父类方法时,static执行的是当前调用方法的类,也就是子类;而self始终指向定义方法的类,即父类。在Laravel模型开发中,由于static代表的是上下文中正在被调用的类,能更好地适应复杂的继承场景,所以更推荐使用static关键字来实现模型静态方法。

通过以上对Laravel模型静态方法多种实现方式的分析,希望能帮助大家在开发中根据实际需求。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/front/16267.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】