如何在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
相关产品推荐
相关产品推荐

