Laravel 模型关系:一对一
一对一:一个人只有一个身份证,一个身份证只属于一个人。
表结构
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();
$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;
// 查看某个人的身份证
$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;
}