数据库是仓库账册,PHP 对象是工头脑子里的业务对象。
Eloquent 干的事,就是在两者之间做翻译。
PHP 世界:Order 对象
SQL 世界:orders 表中的一行
Eloquent:两边都听得懂的账册翻译官一个最小模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $fillable = [
'customer_name',
'product',
'quantity',
'status',
];
}对应的常见操作:
$order = Order::query()->create([
'customer_name' => 'Lin',
'product' => 'Walnut Desk',
'quantity' => 2,
'status' => 'pending',
]);
$pendingOrders = Order::query()
->where('status', 'pending')
->latest()
->get();Eloquent 最重要的不是“语法像英文”,而是它把数据库访问放进了 Laravel 的城区语境里:
- 可以直接配合路由模型绑定
- 可以直接配合验证后的输入
- 可以直接在事件、队列、控制器、Blade、API 中流动
- 关系、作用域、转换、序列化都在同一模型语言里
比如路由模型绑定:
use App\Models\Order;
use Illuminate\Support\Facades\Route;
Route::get('/orders/{order}', function (Order $order) {
return $order;
});这段代码的意思是:
门口写着 {order}
工坊会自动去账册里把这笔订单找出来
然后直接交给你这是 Laravel 很典型的“城区式连贯手感”。
但也要记住:Eloquent 不是让你忘掉 SQL。
它是让你在多数业务场景里用更贴近业务的语言操作数据,同时保留你对查询成本的责任。
最典型的工程提醒就是 N+1 问题:
$orders = Order::with('items.product')->latest()->get();该预加载时就预加载。
工坊账册翻译官很好用,但你不能让他一趟一趟跑仓库。