15. Laravel 模型关系:一对一
Laravel 模型关系:一对一
五个部分
- 创建数据表:migration
- 填充数据表:seeder
- 模型配置:定义模型关系
- 基本使用:增删改查
可能遇到的问题
一对一:一个人只有一个身份证,一个身份证只属于一个人。
表结构
users: id, name
identity_cards: id, city, user_id
// 身份证表的 user_id 是 users 表的外键。
创建数据表
你可以自己手动创建各种数据表。但 Laravel 内置提供了更方便的数据库版本控制器。
php artisan make:migration create_identity_cards_table
// 生成迁移文件,该文件是用来创建数据表的
php artisan migrate // 运行迁移文件,即创建数据表
php artisan migrate:rollback // 回滚迁移操作
填充数据表
php artisan make:factory IdentityCardFactory --model=IdentityCard
模型配置
// App\User
public function identity_card(){
return $this->hasOne('App\IdentityCard');
}
// App\IdentityCard
public function user(){
return $this->belongsTo('App\User');
}
基本使用
增
$card = new App\IdentityCard(['city' => '上海']);
$user = App\User::create([
'name' => request('name'),
'email' => request('email'),
'password' => request('password'),
]);
$user->identity_card()->save($card);
$user = App\User::create([
'name' => request('name'),
'email' => request('email'),
'password' => request('password'),
]);
$user->identity_card()->create(['city' => '上海']);
删
// 删除某个用户的身份证
$user = \App\User::find(1);
$user->identity_card()->delete();
// 删除某张身份证的主人
\App\IdentityCard::find(3)->user()->delete();
改
$card = \App\IdentityCard::find(6);
$card->user()->dissociate();//解除关系
$card->save();
// update `identity_cards` set `user_id` = ?, `identity_cards`.`updated_at` = '2019-09-19 13:26:59' where `id` = 6, null
$user = App\User::find(2);
$card = App\IdentityCard::find(6);
$card->user()->associate($user);//添加关系
$card->save();
$user = \App\User::find(1);
$user->identity_card()->update(['city' => '广州']);
查
// 查看某个人的身份证
$identityCard = App\User::find(1)->identity_card;
// 根据身份证信息找出主人
$user = App\IdentityCard::find(1)->user;
// 有几个身份证,找出它们的主人
// 1. 普通方式(建议使用下面一种)
$cards = App\IdentityCard::find([1, 2]);
foreach ($cards as $card) {
echo $card->user->name;
}
// 2. 延迟加载
$cards = App\IdentityCard::with('user')->find([1, 2]);//数组,查一个直接调用
foreach ($cards as $card) {
echo $card->user->name;
}
可能遇到的问题可能遇到的问题
php artisan migrate 报错 Specified key was too long
一些 mysql 版本限制键的长度是 767
utf8 255*3 765
utf8mb4 255*4 1020
Schema::defaultStringLength(191);
指定 identity_cards 表中的外键字段名称
# users: id, name
# identity_cards: id, city, web_user_id
// App\User
public function identity_card(){
return $this->hasOne('App\IdentityCard', 'web_user_id');
}
指定 identity_cards 表中的外键对应 users 表中的字段名称
# users: id, name
# identity_cards: id, city, user_name
// App\User
public function identity_card(){
return $this->hasOne('App\IdentityCard', 'user_name', 'name');
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?