Eloquent ORM基础:定义模型和使用Eloquent ORM是Laravel框架中用于简化数据库操作的强大工具,它采用面向对象的方式处理数据库查询,避免直接编写SQL语句,降低SQL注入风险,同时提升代码的可维护性和扩展性。
定义Eloquent模型
在Laravel中,每个数据库表通常对应一个模型类,模型类继承自IlluminateDatabaseEloquentModel。定义模型时,需指定表名和可批量赋值的字段。
- 指定表名:通过protected $table属性设置模型对应的数据库表名。若未指定,Eloquent会默认使用模型类名的复数形式作为表名(如User模型对应users表)。
- 指定可批量赋值字段:通过protected $fillable数组设置允许批量赋值的字段,防止恶意用户通过表单提交修改未授权的字段。
示例:定义User模型对应users表,允许批量赋值name、email和password字段。
// app/Models/User.phpnamespace AppModels;use IlluminateDatabaseEloquentModel;class User extends Model{ protected $table = 'users'; protected $fillable = ['name', 'email', 'password'];}使用模型进行CRUD操作
定义模型后,可通过模型对象执行创建、读取、更新和删除(CRUD)操作。
- 创建记录:实例化模型对象,设置属性后调用save()方法。
$user = new User();$user->name = 'John Doe';$user->email = 'john@example.com';$user->password = bcrypt('password123');$user->save();- 读取记录:使用查询构建器方法(如all()、find()、where())获取数据。
// 获取所有用户$users = User::all();// 根据主键获取用户$user = User::find(1);// 条件查询$activeUsers = User::where('active', 1)->get();- 更新记录:先获取记录对象,修改属性后调用save()方法。
$user = User::find(1);$user->email = 'new_email@example.com';$user->save();$user = User::find(1);$user->delete();// 或通过主键直接删除User::destroy(1);查询构建器与排序
Eloquent的查询构建器提供直观的链式调用方法,支持复杂查询和排序。
- 排序:使用orderBy()方法指定排序字段和方向。
$users = User::orderBy('name', 'asc')->get();- 条件查询:结合where()、orWhere()等方法构建条件。
$users = User::where('active', 1) ->orWhere('score', '>', 100) ->get();关系定义
Eloquent支持定义模型间的关系(如一对一、一对多、多对多),简化复杂数据结构的操作。
- 一对一关系:使用hasOne()和belongsTo()方法。
示例:User模型与Phone模型的一对一关系。
// User.phppublic function phone(){ return $this->hasOne(Phone::class);}// Phone.phppublic function user(){ return $this->belongsTo(User::class);}// User.phppublic function posts(){ return $this->hasMany(Post::class);}// Post.phppublic function user(){ return $this->belongsTo(User::class);}// User.phppublic function roles(){ return $this->belongsToMany(Role::class);}// Role.phppublic function users(){ return $this->belongsToMany(User::class);}关系操作示例:
// 获取用户的所有帖子$user = User::find(1);$posts = $user->posts;// 通过帖子获取用户$post = Post::find(1);$user = $post->user;性能优化
使用Eloquent时需注意性能问题,避免N+1查询问题(循环中执行多次查询)。
- Eager Loading(预加载):使用with()方法一次性加载关联数据。
// 避免N+1查询$posts = Post::all();foreach ($posts as $post) { echo $post->user->name; // 每次循环执行一次查询}// 使用Eager Loading$posts = Post::with('user')->get();foreach ($posts as $post) { echo $post->user->name; // 不会额外查询}- 选择必要字段:使用select()方法减少查询字段。
$users = User::select('name', 'email')->get();常见陷阱与注意事项
- findOrFail异常处理:findOrFail方法未找到记录时会抛出ModelNotFoundException异常,需用try-catch处理。
try { $user = User::findOrFail(1);} catch (IlluminateDatabaseEloquentModelNotFoundException $e) { // 处理未找到记录的情况}- 批量赋值安全:确保$fillable或$guarded属性正确设置,防止恶意字段修改。
- 软删除:使用SoftDeletes特性时,查询需显式包含已删除记录(withTrashed())。
总结
Eloquent ORM通过活动记录模式将数据库表映射为对象,提供直观的CRUD操作和关系管理。定义模型时需指定表名和可批量赋值字段,利用查询构建器可构建复杂查询。关系定义简化复杂数据操作,性能优化(如Eager Loading)可避免N+1查询问题。使用时需注意异常处理和批量赋值安全,确保应用高效稳定。