laravel如何使用Eloquent ORM进行数据库查询_Laravel Eloquent ORM数据库查询方法

laravel如何使用Eloquent ORM进行数据库查询_Laravel Eloquent ORM数据库查询方法
最新回答
纞嗳の方程鉽

2026-10-23 10:45:08

Laravel Eloquent ORM 数据库查询方法

Laravel Eloquent ORM 提供了简洁强大的方式操作数据库,通过模型类映射数据库表,支持面向对象查询。以下是核心查询方法详解:

一、基本查询方法

Eloquent 模型默认继承自 IlluminateDatabaseEloquentModel,支持多种链式调用:

  • all():获取模型对应表的所有记录

    $users = User::all();
  • find($id):根据主键查找单条记录

    $user = User::find(1);
  • findOrFail($id):查不到时抛出 404 异常

    $user = User::findOrFail(1);
  • first():返回满足条件的第一条记录

    $user = User::where('status', 1)->first();
  • firstOrFail():未找到时抛出异常

    $user = User::where('status', 1)->firstOrFail();
  • get():执行查询并返回结果集合

    $users = User::where('status', 1)->get();
  • 聚合函数:count()、sum()、max() 等

    $count = User::where('status', 1)->count();

二、条件查询与链式操作

通过 where 方法添加查询条件,支持链式调用组合多个条件:

  • 基础条件:

    where('column', 'value')where('column', '>', $value)
  • 范围查询:

    whereIn('column', [1, 2, 3]) // 字段值在数组中whereNotIn('column', [1, 2]) // 字段值不在数组中
  • 空值判断:

    whereNull('column') // 字段为 NULLwhereNotNull('column') // 字段不为 NULL
  • 排序与分页:

    orderBy('column', 'asc|desc') // 排序skip(10)->take(5) // 分页(跳过10条取5条)

完整示例:

$users = User::where('status', 1) ->whereIn('type', [1, 2]) ->whereNotNull('email_verified_at') ->orderBy('created_at', 'desc') ->skip(0)->take(10) ->get();

三、作用域(Scopes)复用查询逻辑

通过定义本地作用域封装常用查询条件,提升代码复用性:

  1. 在模型中定义作用域:

    class User extends Model { public function scopeActive($query) { return $query->where('status', 1); } public function scopeType($query, $type) { return $query->where('type', $type); }}
  2. 调用作用域:

    $activeUsers = User::active()->get(); // 获取所有活跃用户$adminUsers = User::active()->type(2)->get(); // 获取类型为2的活跃用户

四、关联查询(Relationships)

Eloquent 支持定义模型关系,包括一对一、一对多、多对多:

1. 定义关系
  • 一对一(hasOne / belongsTo):

    // User 模型public function phone() { return $this->hasOne(Phone::class);}// Phone 模型public function user() { return $this->belongsTo(User::class);}
  • 一对多(hasMany / belongsTo):

    // User 模型public function posts() { return $this->hasMany(Post::class);}// Post 模型public function user() { return $this->belongsTo(User::class);}
  • 多对多(belongsToMany):

    // User 模型public function roles() { return $this->belongsToMany(Role::class);}
2. 访问关联数据
  • 直接访问:

    $user = User::find(1);$posts = $user->posts; // 获取该用户所有文章
  • 预加载优化(避免 N+1 查询):

    $users = User::with('posts')->get(); // 预加载所有用户的文章
  • 嵌套预加载:

    $users = User::with(['posts' => function($query) { $query->where('active', 1);}])->get();

五、高级查询技巧

  1. 动态作用域:

    public function scopeStatus($query, $status) { return $query->where('status', $status);}// 调用User::status(1)->get();
  2. 查询条件分组:

    User::where(function($query) { $query->where('name', 'John') ->orWhere('name', 'Jane');})->get();
  3. JSON 字段查询(MySQL 5.7+):

    User::where('options->language', 'en')->get();
  4. 事务中的查询:

    DB::transaction(function() { User::create([...]); Post::create([...]);});

掌握这些核心方法后,可以高效实现各种数据库操作,同时保持代码清晰易维护。Eloquent 的链式调用和面向对象特性使数据库操作更加直观和安全。