2026-10-23 10:45:08
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();通过定义本地作用域封装常用查询条件,提升代码复用性:
在模型中定义作用域:
class User extends Model { public function scopeActive($query) { return $query->where('status', 1); } public function scopeType($query, $type) { return $query->where('type', $type); }}调用作用域:
$activeUsers = User::active()->get(); // 获取所有活跃用户$adminUsers = User::active()->type(2)->get(); // 获取类型为2的活跃用户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);}直接访问:
$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();动态作用域:
public function scopeStatus($query, $status) { return $query->where('status', $status);}// 调用User::status(1)->get();查询条件分组:
User::where(function($query) { $query->where('name', 'John') ->orWhere('name', 'Jane');})->get();JSON 字段查询(MySQL 5.7+):
User::where('options->language', 'en')->get();事务中的查询:
DB::transaction(function() { User::create([...]); Post::create([...]);});掌握这些核心方法后,可以高效实现各种数据库操作,同时保持代码清晰易维护。Eloquent 的链式调用和面向对象特性使数据库操作更加直观和安全。