15. Laravel 模型关系:一对一

Laravel 模型关系:一对一

配套视频地址:https://www.bilibili.com/video/av73028135

五个部分

  1. 创建数据表:migration
  2. 填充数据表:seeder
  3. 模型配置:定义模型关系
  4. 基本使用:增删改查
    可能遇到的问题
    一对一:一个人只有一个身份证,一个身份证只属于一个人。

表结构

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');
}

posted on   何苦->  阅读(135)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示