Laravel-admin 一對多關係的詳解

一對多關聯

表 demo_users , demo_addresses,他們的關係爲:一個用戶有多個收貨地址。一個收貨地址,只能關聯到一個用戶。php

表 demo_users

id username password email
1 tom 123456 tom123@qq.com

Model User.php

public function address(){
    return $this->hasMany(Address::class, 'user_id', 'id');
}

數據展現

在用戶表中展現地址信息。由於用戶和地址是一對多的關係,因此,展現地址信息的時候,須要採用列展開或者模態框展現。注意,默認地址信息中不包含省市區的名稱信息,須要經過With得到省市區的信息。this

Grid

在 用戶表格頁面,經過擴展列,展現用戶的聯繫地址spa

$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 展現用戶的聯繫地址列表code

// 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

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

在地址添加頁面,增長選擇用戶的選擇框orm

// belongsTo 關係,使用的是 Show 實例
$show->user(__('AddressOnwer'),function ($user){
    $user->setResource('/admin/demo_users');
    $user->username(__('User name'));
    $user->email(__('Email'));
});

111114.png

相關文章
相關標籤/搜索