模型关联功能使用说明
模型关联#
laravel 拥有最好的 ORM 组件 模型关联又是大家开发中最常用的功能之一。owl-admin 作为一个 laravel 后台框架,肯定要支持的。很多小伙伴是从 dcat-admin 开始的入门学习。dcat 方便也深入人心。owl 是前后端分离的,所以实现方式也略有不同。
使用说明#
- 首先需要配置好 模型关联关系。这里可以参考 laravel 文档 模型关联
- 然后自定义 service 中的各个方法,如 list update store 等
- 最后 Controller 中的各个方法
模型关联示例代码#
//User Model
class User extends Model
{
public function project()
{
return $this->hasOne(Project::class);
}
public function orders()
{
return $this->hasMany(Order::class);
}
}
//Project 模型
class Project extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
//Order 模型
class Order extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function project()
{
return $this->belongsTo(Project::class);
}
}
示例 curd 列表中实现一对一模型关联#
需要设置 service list 的方法,这个是获取列表数据的#
class OrderService extends AdminService
{
protected string $modelName = Order::class;
//重写 list 方法
public function list()
{
//调用model关联
$query = $this->query()->with('project','agency','huodong');
$items = (clone $query)->paginate(request()->input('perPage', 20))->items();
$total = (clone $query)->count();
return compact('items', 'total');
}
OrderController list 方法代码如下:#
/**
* @property OrderService $service
*/
class OrderController extends AdminController
{
protected string $serviceName = OrderService::class;
public function list(): Page
{
$crud = $this->baseCRUD()->columns([
//这里使用 '.' 对应模型关联
TableColumn::make()->name('project.title')->label('来源渠道'),
TableColumn::make()->name('user.name')->label('客户姓名')
// ...
]);
// ...
}
// ...
}
到这里 curd 列表 的模型关联就完成了
编辑新增时模型关联#
- 页面显示需要配制 OrderController 的 form 方法中配置
public function form($isEdit = false): Form
{
return $this->baseForm()->body([
// ...
TextControl::make('project.title', '项目名称'),
// ...
]);
}
- 需要设置 service 中 update (更新保存) 和 store(新增) 的方法
class OrderService extends AdminService
{
protected string $modelName = Order::class;
// ...
//这里是初始化表格初始值的方法,加载对应的模型后就可以用了
public function getEditData($id)
{
$data=parent::getEditData($id);
$data->load('project');//加载 project model的关联
return $data;
}
//重写 update 方法,用来保存提交的数据
public function update($primaryKey, $data): bool
{
//$data['project'];//这就是模型关联中 project 的数据,需要自行处理保存
//todo 处理对映的关联关系,比如一对一更新或者一对多更新等。
//参考laravel官方的关联关系更新
return parent::update($primaryKey, $data);
}
}
到这里 编辑功能的模型关联也完成了
一对多和一对一的操作是一样的。
推荐文章: