Eloquent ORM基础:定义模型和使用

Eloquent ORM基础:定义模型和使用
最新回答
匿名的关系

2026-10-20 16:47:42

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();
  • 删除记录:调用delete()方法删除记录。
$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);}
  • 一对多关系:使用hasMany()和belongsTo()方法。

    示例:User模型与Post模型的一对多关系(一个用户有多个帖子)。

// User.phppublic function posts(){ return $this->hasMany(Post::class);}// Post.phppublic function user(){ return $this->belongsTo(User::class);}
  • 多对多关系:使用belongsToMany()方法,需定义中间表。

    示例:User模型与Role模型的多对多关系(用户属于多个角色)。

// 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查询问题。使用时需注意异常处理和批量赋值安全,确保应用高效稳定。