Laravel 8 如何正确获取users和orders表一对一关联的用户姓名
问题原因
你的关联定义方向完全搞反了:hasOne 方法默认认为外键存放在被关联的对方表中,所以你在 Order 模型中定义 hasOne(User::class) 时,Laravel 会默认去 users 表查找 order_id 外键,和你的实际表结构完全不符。
另外你的 orders 表的 user_id 字段类型和 users 表的主键类型不匹配,也会导致关联查询异常。
解决步骤
修正模型关联定义
- 外键
user_id存放在orders表中,所以Order模型属于User模型,应该使用belongsTo方法定义关联:
// Order.php public function user() { return $this->belongsTo(User::class); }- 如果确实是一对一关联(一个用户只能对应一个订单),
User模型应该使用hasOne方法定义关联:
// User.php public function order() { return $this->hasOne(Order::class); }如果实际业务中一个用户可以提交多个订单,把上述方法换成
hasMany(Order::class)即可。- 外键
修正外键字段类型
Laravel 8 中id()方法默认生成的是unsignedBigInteger类型的主键,你当前orders表的user_id是tinyInteger类型,类型不匹配会导致关联失效。新建迁移修改字段类型:Schema::table('orders', function (Blueprint $table) { $table->unsignedBigInteger('user_id')->nullable()->change(); });运行迁移前需要先安装字段修改依赖:
composer require doctrine/dbal之后执行
php artisan migrate生效即可。模板可选优化
为了避免关联的用户数据被删除后模板报错,可以用空安全运算符取值:<td>{{ $order->user?->name }}</td>低于PHP7.4版本的环境使用
optional辅助函数:<td>{{ optional($order->user)->name }}</td>
完成以上修改后即可正常通过 $order->user->name 获取下单用户姓名。
内容的提问来源于stack exchange,提问作者user9277271
相关产品推荐
相关产品推荐

