1

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

表 china_area

idparent_idcodename
10100000中华人民共和国

模型定义

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

idnamemobileprovince_idcity_iddistrict_idaddress
1xiaoming1337033xxxx370000370100370102中铁财智中心

模型定义

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

详情 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;
});


后山人
272 声望39 粉丝

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