1

一对多关联

表 demo_users , demo_addresses,他们的关系为:一个用户有多个收货地址。一个收货地址,只能关联到一个用户。

表 demo_users

idusernamepasswordemail
1tom123456tom123@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());
});

111111.png

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

111112.png

表 demo_addresses

idnamemobileprovince_idcity_iddistrict_idaddressuser_id
1田宝勇13075339085370000370100370102中铁财智中心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'));
});

111114.png


后山人
272 声望39 粉丝

这个是一个典型的,前后端分离的开发框架,而且很多前后端代码,都可以很好的生成,无需写代码,大大减少程序员编写代码的数量。提高效率,降低成本!