一对多关联
表 demo_users , demo_addresses,他们的关系为:一个用户有多个收货地址。一个收货地址,只能关联到一个用户。
表 demo_users
id | username | password | |
---|---|---|---|
1 | tom | 123456 | tom123@qq.com |
Model User.php
public function address(){
return $this->hasMany(Address::class, 'user_id', 'id');
}
数据展示
在用户表中展示地址信息。因为用户和地址是一对多的关系,所以,展示地址信息的时候,需要采用列展开或者模态框展示。注意,默认地址信息中不包含省市区的名称信息,需要通过With获得省市区的信息。
Grid
在 用户表格页面,通过扩展列,展示用户的联系地址
$grid->column('Address', __('Contact'))->expand(function ($model) {
$addresses = $model->addresses()->with(['province','city','district'])->get()->map(function ($address) {
return [
'name'=> $address->name,
'mobile' => $address->mobile,
'area' => $address->getRelation('province')->name.'-'.$address->getRelation('city')->name.'-'.$address->getRelation('district')->name,
'address' => $address->address
];
});
return new Table([__('Contact Name'),__('Contact Phone'),__('Province Area District'),__('Contact Address')], $addresses->toArray());
});
Detail 详情页面
以新的 grid 展示用户的联系地址列表
// hasMany关系,使用的是 Grid 实例
$show->addresses(__('ContactOfList'),function ($addresses){
$addresses->resource('/admin/addresses');
$addresses->name(__('Contact Name'));
$addresses->mobile(__('Contact Phone'));
$addresses->Area(__('Area'))->display(function (){
return $this->province->name.'-'.$this->city->name.'-'.$this->district->name;
});
$addresses->address(__('Contact Address'));
});
表 demo_addresses
id | name | mobile | province_id | city_id | district_id | address | user_id |
---|---|---|---|---|---|---|---|
1 | 田宝勇 | 13075339085 | 370000 | 370100 | 370102 | 中铁财智中心 | 1 |
public function user(){
return $this->belongsTo(User::class, 'user_id', 'id');
}
Form
在地址添加页面,增加选择用户的选择框
// belongsTo 关系,使用的是 Show 实例
$show->user(__('AddressOnwer'),function ($user){
$user->setResource('/admin/demo_users');
$user->username(__('User name'));
$user->email(__('Email'));
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。