ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
我们先从建立一个 Eloquent 模型开始。模型通常放在 app 目录下,但是您可以将它们放在任何地方,只要能通过 composer.json 自动载入。所有的 Eloquent 模型都继承于 Illuminate\Database\Eloquent\Model 。 ## 定义一个 Eloquent 模型 ~~~ class User extends Model {} ~~~ 你也可以通过 make:model 命令自动生成 Eloquent 模型: ~~~ php artisan make:model User ~~~ > 注意:我们并没有告诉 Eloquent User 模型会使用哪个数据库表。若没有特别指定,系统会默认自动对应名称为「类名称的小写复数形态」的数据库表。所以,在上面的例子中, Eloquent 会假设 User 模型将把数据存在 users 数据库表。您也可以在类中定义 table 属性自定义要对应的数据库表。 ~~~ class User extends Model { protected $table = 'my_users'; } ~~~ > 注意: Eloquent 也会假设每个数据库表都有一个字段名称为 id 的主键。您可以在类里定义 primaryKey 属性来重写。同样的,您也可以定义 connection 属性,指定模型连接到指定的数据库连接。 定义好模型之后,您就可以从数据库表新增及获取数据了。注意在默认情况下,在数据库表里需要有 updated_at 和 created_at 两个字段。如果您不想设定或自动更新这两个字段,则将类里的 $timestamps 属性设为 false即可。 ## 取出所有模型数据 ~~~ $users = User::all(); ~~~ ## 根据主键取出一条数据 ~~~ $user = User::find(1); var_dump($user->name); ~~~ > 提示: 所有查询构造器里的方法,查询 Eloquent 模型时也可以使用。 ## 根据主键取出一条数据或抛出异常 有时, 您可能想要在找不到模型数据时抛出异常,通过 `firstOrFail` 方法。 ~~~ $model = User::findOrFail(1); $model = User::where('votes', '>', 100)->firstOrFail(); ~~~ Doing this will let you catch the exception so you can log and display an error page as necessary. To catch the ModelNotFoundException, add some logic to your app/Exceptions/Handler.php file. ~~~ use Illuminate\Database\Eloquent\ModelNotFoundException; class Handler extends ExceptionHandler { public function render($request, Exception $e) { if ($e instanceof ModelNotFoundException) { // Custom logic for model not found... } return parent::render($request, $e); } } ~~~ ## Eloquent 模型结合查询语法 ~~~ $users = User::where('votes', '>', 100)->take(10)->get(); foreach ($users as $user) { var_dump($user->name); } ~~~ ## Eloquent 聚合查询 当然,您也可以使用查询构造器的聚合查询方法。 ~~~ $count = User::where('votes', '>', 100)->count(); ~~~ 如果没办法使用流畅接口产生出查询语句,也可以使用 whereRaw 方法: ~~~ $users = User::whereRaw('age > ? and votes = 100', [25])->get(); ~~~ ## 拆分查询 如果您要处理非常多(数千条)Eloquent 查询结果,使用 chunk 方法可以让您顺利工作而不会消耗大量内存: ~~~ User::chunk(200, function($users) { foreach ($users as $user) { // } }); ~~~ 传到方法里的第一个参数表示每次「拆分」要取出的数据数量。第二个参数的闭合函数会在每次取出数据时被调用。 ## 指定查询时连接数据库 您也可以指定在执行 Eloquent 查询时要使用哪个数据库连接。只要使用 on 方法: ~~~ $user = User::on('connection-name')->find(1); ~~~ 如果您在使用 读取 / 写入连接, 您可以通过如下命令来强制查询使用 写入 连接: ~~~ $user = User::onWriteConnection()->find(1); ~~~