Laravel 模型静态方法使用
目录
静态方法的多种实现方式
在Laravel模型中,可以采用static关键字、self关键字、(new static())来链式调用构造器方法,对外层业务层提供静态方法调用
1. static关键字(优先推荐)
定义:
static关键字是PHP5.3版本之后引入的特性,即后期静态绑定, 是运行时决定, 指向的是调用时的类,如果存在类继承,代表调用的类,可以是子类或父类;
在模型中,推荐可以使用static::query()进行调用,特别是在如果存在查询作用域方法时防止报错,也可以static::调用
使用举例
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();
}
}
2. self关键字调用
定义:
self关键字是固定指向了定义了该方法的类,如果存在类继承,子类继承父类,且覆盖了父类方法,此时self调用得到的,还是父类的方法
使用举例
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();
}
}
3. (new static()) (不推荐)
定义:
(new static())是实例化当前类的对象,指向的是调用时的类。 继承关系上与static相同。
不推荐此做法,本身是在实例化增加内存开销,而且在模型静态方法内使用,不符合场景
使用举例
class User extends Model
{
protected $table = 'users';
/**
* 根据ID数组获取用户信息
*/
public static function countById($ids): array
{
return (new static())->whereIn('id', $ids)->get()->toArray();
}
}
4. static和self的异同
- 两者在类没有继承关系时,得到的完全一样,没有区别,可以交换使用
- 当存在继承关系时, 子类继承父类,并实现父类方法,此时
static执行的是当前调用方法的类,即子类;而self指向定义方法的类,即父类 - 在模型中,更推荐
static,因为它代表上下文中正在被调用的类 - [参考文档][www.cnblogs.com/shizqiang/p…]