【提问】关于一键生成CRUD关联菜单,添加编辑页面关联数据不显示-默认板块论坛-fastadmin-猫叔的编程圈

已解决关于一键生成CRUD关联菜单,添加编辑页面关联数据不显示

你好猫叔,今天遇到了一个问题,我在后台一键生成CRUD关联菜单,添加编辑页面关联数据不显示。

数据库 fa_user_agreement_category 协议分类表

-- phpMyAdmin SQL Dump
-- version 5.1.1
-- https://www.phpmyadmin.net/
--
-- 主机: localhost
-- 生成日期: 2024-04-17 16:33:11
-- 服务器版本: 5.7.44-log
-- PHP 版本: 7.2.33

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- 数据库: `xxxx
--

-- --------------------------------------------------------

--
-- 表的结构 `fa_user_agreement_category`
--

CREATE TABLE `fa_user_agreement_category` (
  `id` int(10) UNSIGNED NOT NULL COMMENT 'ID',
  `category_name` varchar(255) NOT NULL COMMENT '协议分类名称',
  `status` enum('0','1') NOT NULL COMMENT '状态:0=隐藏,1=正常',
  `createtime` bigint(16) NOT NULL COMMENT '创建时间',
  `updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',
  `deletetime` bigint(16) DEFAULT NULL COMMENT '删除时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- 转存表中的数据 `fa_user_agreement_category`
--

INSERT INTO `fa_user_agreement_category` (`id`, `category_name`, `status`, `createtime`, `updatetime`, `deletetime`) VALUES
(1, '用户协议', '1', 1713246245, 1713246245, NULL);

--
-- 转储表的索引
--

--
-- 表的索引 `fa_user_agreement_category`
--
ALTER TABLE `fa_user_agreement_category`
  ADD PRIMARY KEY (`id`);

--
-- 在导出的表使用AUTO_INCREMENT
--

--
-- 使用表AUTO_INCREMENT `fa_user_agreement_category`
--
ALTER TABLE `fa_user_agreement_category`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=2;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

数据库 fa_user_agreement 协议内容表

-- phpMyAdmin SQL Dump
-- version 5.1.1
-- https://www.phpmyadmin.net/
--
-- 主机: localhost
-- 生成日期: 2024-04-17 16:34:40
-- 服务器版本: 5.7.44-log
-- PHP 版本: 7.2.33

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- 数据库: `xiaofang`
--

-- --------------------------------------------------------

--
-- 表的结构 `fa_user_agreement`
--

CREATE TABLE `fa_user_agreement` (
  `id` int(10) UNSIGNED NOT NULL COMMENT '协议ID',
  `category_id` int(10) NOT NULL COMMENT '分类ID',
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '协议名称',
  `verson` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '协议版本',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '协议内容',
  `status` enum('0','1','2') NOT NULL DEFAULT '0' COMMENT '状态:0=隐藏,1=正常,2=推荐',
  `createtime` bigint(16) NOT NULL COMMENT '创建时间',
  `updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',
  `deletetime` bigint(16) DEFAULT NULL COMMENT '删除时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户协议';

--
-- 转存表中的数据 `fa_user_agreement`
--

INSERT INTO `fa_user_agreement` (`id`, `category_id`, `name`, `verson`, `content`, `status`, `createtime`, `updatetime`, `deletetime`) VALUES
(1, 1, '医院总务管理应用用户协议', '1.0', '一、协议概述\r\n\r\n欢迎您使用XXX应用(以下简称“本应用”)。本用户协议(以下简称“本协议”)是您与本应用之间关于您下载、安装、使用、复制本应用,注册、登录、使用本应用账号,以及使用本应用相关服务所订立的协议。请您仔细阅读本协议,您点击“同意”按钮后,本协议即构成对本应用有约束力的法律文件。\r\n\r\n二、服务内容\r\n\r\n本应用将为您提供一个社交媒体平台,您可以在此发现、分享和交流各种内容。\r\n\r\n本应用可能会提供与服务相关的其他功能或服务,具体以本应用实际提供的功能或服务为准。\r\n\r\n三、账号注册与使用\r\n\r\n您在使用本应用前需要注册一个本应用账号。您应当提供真实、准确、完整的注册信息,并在注册信息发生变化时及时更新。您应妥善保管您的账号和密码,对您的账号和密码的安全性负责。\r\n\r\n您有权使用您的账号登录并使用本应用,但不得进行恶意注册、使用账号进行违法违规行为。\r\n\r\n四、用户行为规范\r\n\r\n您在使用本应用时应遵守法律法规、社会公德和公序良俗,不得发布或传播任何违法、违规、虚假、淫秽、暴力、恐怖、侵犯他人权益等不良信息。\r\n\r\n您不得利用本应用进行任何商业行为,包括但不限于发布广告、销售商品或服务、进行金融投资等。\r\n\r\n您不得利用任何技术手段或工具干扰、破坏本应用的正常运行或干扰其他用户的使用。\r\n\r\n五、知识产权\r\n\r\n本应用所包含的所有内容,包括但不限于文字、图片、音频、视频、软件等,均受知识产权法律法规的保护。未经本应用书面许可,您不得擅自复制、传播、使用、修改、演绎或以其他任何方式侵犯本应用的知识产权。\r\n\r\n您在使用本应用过程中上传、发布的所有内容,您应保证其合法性、真实性和完整性,并承担由此产生的全部法律责任。您授予本应用在全球范围内免费、永久、不可撤销、非独家且可完全转授权的权利和许可,以使用、复制、修改、演绎、发行、翻译、展示和传播您的上传、发布的内容。\r\n\r\n六、终止服务\r\n\r\n如果您违反了本协议或相关法律法规,本应用有权立即终止您的账号并阻止您进一步访问或使用本应用。\r\n\r\n七、免责声明\r\n\r\n本应用对因用户使用本应用而产生的任何直接或间接损失不承担任何责任。本应用对用户的任何通知,不论是口头还是书面的,均不表示本应用做出在本协议陈述以外的任何担保责任。\r\n\r\n八、法律适用和管辖\r\n\r\n本协议的签订、履行、解释及争议解决均适用中华人民共和国法律。若您和本应用之间发生任何纠纷或争议,首先应友好协商解决;协商不成的,您同意将纠纷或争议提交本应用所在地有管辖权的人民法院管辖。\r\n\r\n九、第三方链接和服务\r\n\r\n本应用可能会提供第三方链接或服务,例如广告、社交媒体插件、第三方登录等。这些链接或服务可能由第三方独立运营,我们不对这些第三方的隐私政策、内容或服务承担任何责任。当您点击这些链接或使用这些服务时,您应当仔细阅读并遵守该第三方的隐私政策和服务条款。\r\n\r\n本应用可能会与第三方合作,共同为您提供服务。在这种情况下,我们可能会与该第三方共享您的某些信息,但仅限于为实现合作目的所必需的信息,并且我们会与该第三方签订严格的保密协议,要求其按照本隐私政策的要求处理您的个人信息。\r\n\r\n十、用户反馈和建议\r\n\r\n我们欢迎用户提出反馈和建议,以帮助我们改进和优化服务。如果您向我们提供任何反馈或建议,您同意我们有权自由使用、复制、修改、演绎、发行、翻译、展示和传播这些反馈或建议,而无需向您支付任何费用或向您提供任何补偿。\r\n\r\n十一、不可抗力\r\n\r\n对于因自然灾害、战争、政府行为等不可抗力因素导致的服务中断、数据丢失等问题,我们将尽最大努力恢复服务,但对此类问题造成的损失,我们不承担任何责任。\r\n\r\n十二、协议的修改和解释权\r\n\r\n本协议的所有权和解释权归本应用所有。我们有权随时修改本协议,并在本应用上发布修改后的协议。修改后的协议自发布之日起生效,并代替原协议。如果您不同意修改后的协议,您应当立即停止使用本应用。\r\n\r\n如果您对本协议有任何疑问或建议,请通过本应用提供的联系方式与我们联系。我们将尽快回复您的问题并提供必要的帮助。\r\n', '1', 1713265159, 1713265159, NULL);

--
-- 转储表的索引
--

--
-- 表的索引 `fa_user_agreement`
--
ALTER TABLE `fa_user_agreement`
  ADD PRIMARY KEY (`id`) USING BTREE;

--
-- 在导出的表使用AUTO_INCREMENT
--

--
-- 使用表AUTO_INCREMENT `fa_user_agreement`
--
ALTER TABLE `fa_user_agreement`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '协议ID', AUTO_INCREMENT=2;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

控制文件 application/admin/controller/UserAgreement.php

<?php

namespace app\admin\controller;

use app\common\controller\Backend;

/**
 * 用户协议
 *
 * @icon fa fa-circle-o
 */
class UserAgreement extends Backend
{

    /**
     * UserAgreement模型对象
     * @var \app\admin\model\UserAgreement
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\UserAgreement;
        $this->view->assign("statusList", $this->model->getStatusList());
    }



    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */


    /**
     * 查看
     */
    public function index()
    {
        //当前是否为关联查询
        $this->relationSearch = true;
        //设置过滤方法
        $this->request->filter(['strip_tags', 'trim']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();

            $list = $this->model
                    ->with(['category'])
                    ->where($where)
                    ->order($sort, $order)
                    ->paginate($limit);

            foreach ($list as $row) {
                $row->visible(['id','category_id','name','verson','content','status','createtime','updatetime','deletetime']);
                $row->visible(['category']);
				$row->getRelation('category')->visible(['category_name']);
            }

            $result = array("total" => $list->total(), "rows" => $list->items());

            return json($result);
        }
        return $this->view->fetch();
    }

}

控制文件 application/admin/controller/UserAgreementCategory.php

<?php

namespace app\admin\controller;

use app\common\controller\Backend;

/**
 * 
 *
 * @icon fa fa-circle-o
 */
class UserAgreementCategory extends Backend
{

    /**
     * UserAgreementCategory模型对象
     * @var \app\admin\model\UserAgreementCategory
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\UserAgreementCategory;
        $this->view->assign("statusList", $this->model->getStatusList());
    }



    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */


    /**
     * 查看
     */
    public function index()
    {
        //当前是否为关联查询
        $this->relationSearch = false;
        //设置过滤方法
        $this->request->filter(['strip_tags', 'trim']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();

            $list = $this->model
                    
                    ->where($where)
                    ->order($sort, $order)
                    ->paginate($limit);

            foreach ($list as $row) {
                $row->visible(['id','category_name','status','createtime','updatetime','deletetime']);
                
            }

            $result = array("total" => $list->total(), "rows" => $list->items());

            return json($result);
        }
        return $this->view->fetch();
    }

}

模型文件application/admin/model/UserAgreement.php

<?php

namespace app\admin\model;

use think\Model;
use traits\model\SoftDelete;

class UserAgreement extends Model
{

    use SoftDelete;

    

    // 表名
    protected $name = 'user_agreement';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'integer';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = 'deletetime';

    // 追加属性
    protected $append = [
        'status_text'
    ];
    

    
    public function getStatusList()
    {
        return ['0' => __('Status 0'), '1' => __('Status 1'), '2' => __('Status 2')];
    }


    public function getStatusTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
        $list = $this->getStatusList();
        return isset($list[$value]) ? $list[$value] : '';
    }




    public function category()
    {
        return $this->belongsTo('app\admin\model\user\agreement\Category', 'category_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }
}

模型文件application/admin/model/UserAgreementCategory.php

<?php

namespace app\admin\model;

use think\Model;
use traits\model\SoftDelete;

class UserAgreementCategory extends Model
{

    use SoftDelete;

    

    // 表名
    protected $name = 'user_agreement_category';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'integer';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = 'deletetime';

    // 追加属性
    protected $append = [
        'status_text'
    ];
    

    
    public function getStatusList()
    {
        return ['0' => __('Status 0'), '1' => __('Status 1')];
    }


    public function getStatusTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
        $list = $this->getStatusList();
        return isset($list[$value]) ? $list[$value] : '';
    }




}

模板文件 application/admin/view/UserAgreement/add.html

<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">

    <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
        <div class="col-xs-12 col-sm-8">
            <input id="c-category_id" data-rule="required" data-field="category_name" data-source="category/selectpage" data-params='{"custom[type]":"user_agreement"}' class="form-control selectpage" name="row[category_id]" type="text" value="">
        </div>
    </div>
    <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
        <div class="col-xs-12 col-sm-8">
            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text">
        </div>
    </div>
    <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Verson')}:</label>
        <div class="col-xs-12 col-sm-8">
            <textarea id="c-verson" data-rule="required" class="form-control " rows="5" name="row[verson]" cols="50"></textarea>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
        <div class="col-xs-12 col-sm-8">
            <textarea id="c-content" data-rule="required" class="form-control editor" rows="5" name="row[content]" cols="50"></textarea>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
        <div class="col-xs-12 col-sm-8">
            
            <div class="radio">
            {foreach name="statusList" item="vo"}
            <label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="0"}checked{/in} /> {$vo}</label> 
            {/foreach}
            </div>

        </div>
    </div>
    <div class="form-group layer-footer">
        <label class="control-label col-xs-12 col-sm-2"></label>
        <div class="col-xs-12 col-sm-8">
            <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
        </div>
    </div>
</form>

 

 

我想 把 fa_user_agreement 的 category_id 表 关联到fa_user_agreement_category的id表

怎么样修改才实现呢?

目前遇到问题截图

a

 

想得到的效果

b

 

请登录后发表评论

    请登录后查看评论内容