20 个 Laravel Eloquent 必备的实用技巧

  1. 递增和递减
$article = Article::find($article_id);
$article->imcrement('read_count');

Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count',10);  // +10
Article::find($article_id)->increment('stock'); // -1
  1. 先执行X方法 X方法执行不成功则执行Y方法
$user = User::find($id);
if(!$user){
    abort(404);
}

# 替代以上代码的写法
$user = User::findOrFail($id);

---------------------------------------------------------

$user = User::where('email',$email)->first();
if(!$user){
    User::create([
        'email' => $email
    ]);
}

# 替代以上代码的写法
$user = User::firstOrCreate(['email' => $email]);
  1. 模型的boot()方法


class User extends Model{
    //在一个 Eloquent 模型中,有个神奇的地方,叫 boot(),在那里,你可以覆盖默认的行为
    public static function boot(){
        parent::boot();
        static::updating(function($model){
           //覆盖一些属性 类似这样 $model->something = transform($something) 
        });
    }
    
    //生成 UUID 字段
    public static function boot(){
        parent::boot();
        self::creating(function ($model){
           $model->uuid = (string)Uuid::generate(); 
        });
    }
}
  1. 带条件与排序的关联关系
定义关联关系的一般方式
public function users(){
    return $this->hasMany('App\User');
}
如果你想关联某些类型的用户,同时使用 email 字段排序,你可以这样做:
public function approvedUsers(){
    return $this->hasMany('App\User')->where('approved',1)->orderBy('email');
}
  1. 模型特性: 时间、追加等

    更多特征

class User extends Model{
    
     
    protected $table = 'users'; // 与模型关联的表
    protected $fillable = ['email','password'];// 可以被批量赋值字段 User::create() 新增时 可使用字段
    protected $dates = ['created_at','deleted_at']; // 需要被Carbon维护的字段名
    protected $appends = ['field1','field2']; // json返回时 附加的字段
   
   
    protected $primaryKey = 'uuid'; // 更换主键
    public $incrementing = false; // 设置 不自增长
    protected $perPage = 25; // 定义分页每页显示数量 默认15
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at'; // 重写 时间字段名
    public $timestamps = false; // 设置不需要维护时间字段
    
    
}

  1. 通过ID查询多条记录
$user = User::find(1);

# 可以接受多个ID的数组作为参数
$users = User::find([1,2,3]);
  1. WhereX
$users = User::where('approved',1)->get();
转换成:
$users = User::whereApproved(1)->get();

和时间相关的预定义方法
User::whereDate('created_at',date('Y-m-d'));
User::whereDay('created_at',date('d'));
User::whereMonth('created_at',date('m'));
User::whereYear('created_at',date('Y'));
  1. 通过关系排序
为主题的最新帖子定义一个单独的关系
public function latestPost(){
    return $this->hasOne(\App\Post::class)->latest();
}
在控制器中实现
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
  1. Eloquent::when() -- 不再使用if-else
if(request('filter_by') == 'likes'){
    $query->where('likes','>','request('likes_amount',0));
}
if(request('filter_by') == 'date'){
    $query->orderBy('created_at',request('ordering_rule','desc'));
}
更好的方法 使用 when()
$query = Author::query();
$query->when(request('filter_by') == 'likes',function($q){
    return $q->where('likes','>',request('likes_amount',0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
它可能看上去不是很优雅,但它强大的功能是传递参数:
$query = User::query();
$query->when(request('role', false), function ($q, $role) {
    return $q->where('role_id', $role);
});
$authors = $query->get();
  1. BelongsTo 默认模型
{{ $post->author->name}}
但是如果作者被删除了,或者因为某些原因未设置?你就会得到一个错误信息,类似「不存在的对象属性」。

那么,你可以这么避免它:
{{ $post->author->name ?? ''}}