You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel 5.6中使用模型关联?附商品表迁移代码

Laravel 5.6 模型关联实操指南(适配你的商品表场景)

嘿,你已经通过迁移搭好商品表的基础结构了,接下来咱们一步步搞定模型关联的事儿,其实没那么复杂,跟着我来就行!

第一步:准备模型文件

首先得确保你有Product和Admin这两个模型文件,如果还没有,直接用Artisan命令生成:

php artisan make:model Product
php artisan make:model Admin

要是已经存在这两个模型,直接跳过这一步就好。

第二步:定义关联关系

从你的迁移代码能看到,products表里的admin_id是关联admins表id的外键,所以咱们要在两个模型里分别定义一对多和属于的关联:

在Admin模型(app/Admin.php)中

一个管理员可以发布多个商品,这是典型的一对多关联:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    // 你的表名是admins,符合Laravel默认的复数规则,所以不用额外指定表名
    // protected $table = 'admins';

    // 定义与商品的一对多关联
    public function products()
    {
        // 第二个参数是外键名,这里正好是admin_id,其实也可以省略,但写上更直观
        return $this->hasMany(Product::class, 'admin_id');
    }
}

在Product模型(app/Product.php)中

每个商品都属于一个管理员,这是属于关联:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 同理,products是默认复数表名,无需额外指定
    // protected $table = 'products';

    // 定义与管理员的属于关联
    public function admin()
    {
        // 这里外键admin_id符合Laravel默认规则,也可以省略第二个参数
        return $this->belongsTo(Admin::class, 'admin_id');
    }
}

第三步:关联关系的实际使用

接下来给你举几个日常开发里常用的场景,一看就懂:

1. 获取某个管理员的所有商品

比如要拿id为1的管理员发布的所有商品:

$admin = Admin::find(1);
// 直接访问products属性,Laravel会自动帮你执行查询
$allProducts = $admin->products;

// 要是想加筛选条件,比如只拿上架的商品,就用关联的查询构造器
$activeProducts = $admin->products()->where('status', 1)->get();

2. 获取某个商品对应的管理员信息

比如想知道id为5的商品是谁发布的:

$product = Product::find(5);
// 直接访问admin属性就能拿到对应的管理员数据
$creator = $product->admin;

// 重点提醒!批量查询商品并获取管理员时,一定要用预加载避免N+1查询问题
// 这样只执行2次SQL:一次查所有商品,一次查对应的管理员
$productsWithAdmins = Product::with('admin')->get();
foreach ($productsWithAdmins as $product) {
    echo "{$product->name} 由管理员 {$product->admin->name} 创建";
}

3. 通过管理员快速创建商品

不用手动填写admin_id,关联会自动帮你填充外键:

$admin = Admin::find(1);
$newProduct = $admin->products()->create([
    'name' => '新款无线耳机',
    'slug' => 'new-wireless-headset',
    'description' => '超长续航,音质拉满',
    'tags' => '数码,耳机',
    'original_price' => '299.99',
    'view_order' => 2,
    // 这里不用写admin_id,关联会自动把当前管理员的id填进去
]);

第四步:避坑提醒——N+1查询问题

刚才提到的预加载一定要记牢!如果你循环遍历商品时每次都调用$product->admin,默认会每次循环都执行一次SQL查询,数据量大的时候性能会崩。用with('admin')预加载就能一次性把所有需要的管理员数据查出来,大大提升效率。

额外:后续扩展关联的思路

要是以后你想给商品加分类,比如加个category_id外键关联categories表,关联写法也是一样的:

  • 在Product模型加:public function category() { return $this->belongsTo(Category::class); }
  • 在Category模型加:public function products() { return $this->hasMany(Product::class); }
    用法和上面的管理员关联完全一致。

内容的提问来源于stack exchange,提问作者DRPK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:32:00