模型关联功能使用说明

未匹配的标注

模型关联

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

到这里 编辑功能的模型关联也完成了

一对多和一对一的操作是一样的。

欢迎大家的补充和指正,谢谢

官方资源

owl admin 文档
demo地址
amis所有组件示例

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~