全书目录

第二十七篇:Laravel 完全指南 —— 工匠城区宇宙

第六章:Eloquent —— 工坊账册翻译官

1 分钟 369 字 第 483 / 962 个阅读单元

数据库是仓库账册,PHP 对象是工头脑子里的业务对象。

Eloquent 干的事,就是在两者之间做翻译。

text
PHP 世界:Order 对象
SQL 世界:orders 表中的一行
Eloquent:两边都听得懂的账册翻译官

一个最小模型:

php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $fillable = [
        'customer_name',
        'product',
        'quantity',
        'status',
    ];
}

对应的常见操作:

php
$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 中流动
  • 关系、作用域、转换、序列化都在同一模型语言里

比如路由模型绑定:

php
use App\Models\Order;
use Illuminate\Support\Facades\Route;

Route::get('/orders/{order}', function (Order $order) {
    return $order;
});

这段代码的意思是:

text
门口写着 {order}
工坊会自动去账册里把这笔订单找出来
然后直接交给你

这是 Laravel 很典型的“城区式连贯手感”。

但也要记住:Eloquent 不是让你忘掉 SQL。
它是让你在多数业务场景里用更贴近业务的语言操作数据,同时保留你对查询成本的责任。

最典型的工程提醒就是 N+1 问题:

php
$orders = Order::with('items.product')->latest()->get();

该预加载时就预加载。
工坊账册翻译官很好用,但你不能让他一趟一趟跑仓库。