laravel-admin 关于多列一对多的展示问题

关于多列一对多的展示问题

表 china_area

id parent_id code name
1 0 100000 中华人民共和国

模型定义

class ChinaArea extends Model 
{
    protected $table = 'china_area'; // 定义模型对应的数据库表名
    public $timestamps = false; // 关闭自动添加创建时间和更新时间
    
    public parent()
    {
        // 参数列表为:模型(ChinaArea::class),外键列名(parent_id),本地键列名(id)
        return $this->belongsTo(ChinaArea::class, 'parent_id');
    }
    ...
}

表 demo_addresses

id name mobile province_id city_id district_id address
1 xiaoming 1337033xxxx 370000 370100 370102 中铁财智中心

模型定义

class Address extends Model
{
    protected $table = 'demo_addresses'; // 定义模型对应的数据库表名
    // 省的关联
    public function province()
    {    
        return $this->belongsTo(ChinaArea::class, 'province_id', 'code');
    }
    // 市的关联
    public function city()
    {
        return $this->belongsTo(ChinaArea::class, 'city_id', 'code');
    }
    // 区的关联
    public function district()
    {
        return $this->belongsTo(ChinaArea::class, 'district_id', 'code');
    }
}

数据表格 grid 的列展示

// 本表的列展示
$grid->column('name', __('Contact Name'));
// 关联数据的展示
$grid->column('province.name', __('Province'));
// 合并多列的展示
$grid->column('Area',__('Area'))->display(function (){
    return $this->province->name.'-'.$this->city->name.'-'.$this->district->name;
});

laravel-admin 关于多列一对多的展示问题_第1张图片

详情 detail 的数据展示

// 默认模型查询
// $show = new Show(Address::findOrFail($id)); 
// 展示关联列数据的时候,必须重新定义模型查询
$address = Address::with('province')->with('city')->with('district')->findOrFail($id);
$show = new Show($address);
// 本表数据的展示
$show->field('name', __('Contact Name'));
$show->mobile(__('Contact Phone'));
// 展示关联列数据的时候,必须重新定义模型查询
$show->field('anyName', __('Area'))->as(function (){
        return $this->getRelation('province')->name.'-'.$this->getRelation('city')->name.'-'.$this->getRelation('district')->name;
});

laravel-admin 关于多列一对多的展示问题_第2张图片

你可能感兴趣的