模型关联功能使用说明

未匹配的标注

模型关联

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 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~