118 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace app\model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Exception;
							 | 
						||
| 
								 | 
							
								use think\db\exception\DataNotFoundException;
							 | 
						||
| 
								 | 
							
								use think\db\exception\DbException;
							 | 
						||
| 
								 | 
							
								use think\db\exception\ModelNotFoundException;
							 | 
						||
| 
								 | 
							
								use think\facade\Db;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 文档模型字段
							 | 
						||
| 
								 | 
							
								 * Class ArchivesModelField
							 | 
						||
| 
								 | 
							
								 * @package app\model
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class ArchivesModelField extends Base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public const VIRTUAL_YES = 1;//虚拟字段 是
							 | 
						||
| 
								 | 
							
								    public const VIRTUAL_NO  = 0;//虚拟字段 否
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 模型添加字段列表
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param  int  $modelId
							 | 
						||
| 
								 | 
							
								     * @param  string  $modelName
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function setFieldList(int $modelId, string $modelName)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (self::where('model_id', $modelId)->count() <= 0) {
							 | 
						||
| 
								 | 
							
								            $rs     = Db::query("SHOW FULL COLUMNS FROM ".Archives::ORIGINAL_TABLE);
							 | 
						||
| 
								 | 
							
								            $insert = [];
							 | 
						||
| 
								 | 
							
								            foreach ($rs as $val) {
							 | 
						||
| 
								 | 
							
								                $arr             = [];
							 | 
						||
| 
								 | 
							
								                $arr['model_id'] = $modelId;
							 | 
						||
| 
								 | 
							
								                $arr['model']    = $modelName;
							 | 
						||
| 
								 | 
							
								                $arr['name']     = $val['Field'];
							 | 
						||
| 
								 | 
							
								                $arr['title']    = $val['Comment'];
							 | 
						||
| 
								 | 
							
								                $arr['remark']   = $val['Comment'];
							 | 
						||
| 
								 | 
							
								                $insert[]        = $arr;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            (new self())->saveAll($insert);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 同步字段
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param  int  $modelId
							 | 
						||
| 
								 | 
							
								     * @param  string  $modelName
							 | 
						||
| 
								 | 
							
								     * @throws DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws DbException
							 | 
						||
| 
								 | 
							
								     * @throws ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function syncFieldList(int $modelId, string $modelName)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $rs           = Db::query("SHOW FULL COLUMNS FROM ".Archives::ORIGINAL_TABLE);
							 | 
						||
| 
								 | 
							
								        $oldFieldList = self::where('model_id', $modelId)->where('is_virtual', self::VIRTUAL_NO)->select();
							 | 
						||
| 
								 | 
							
								        $oldFields    = $oldFieldList->column('name');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $newestFields = [];
							 | 
						||
| 
								 | 
							
								        foreach ($rs as $val) {
							 | 
						||
| 
								 | 
							
								            $newestFields[] = $val['Field'];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //待删除字段
							 | 
						||
| 
								 | 
							
								        $delete = array_diff($oldFields, $newestFields);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //待新增字段
							 | 
						||
| 
								 | 
							
								        $needInsertFields = array_diff($newestFields, $oldFields);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $insert = [];//新增字段
							 | 
						||
| 
								 | 
							
								        foreach ($rs as $val) {
							 | 
						||
| 
								 | 
							
								            if (in_array($val['Field'], $needInsertFields)) {
							 | 
						||
| 
								 | 
							
								                $arr             = [];
							 | 
						||
| 
								 | 
							
								                $arr['model_id'] = $modelId;
							 | 
						||
| 
								 | 
							
								                $arr['model']    = $modelName;
							 | 
						||
| 
								 | 
							
								                $arr['name']     = $val['Field'];
							 | 
						||
| 
								 | 
							
								                $arr['title']    = $val['Comment'];
							 | 
						||
| 
								 | 
							
								                $arr['remark']   = $val['Comment'];
							 | 
						||
| 
								 | 
							
								                $insert[]        = $arr;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        (new self())->saveAll($insert);
							 | 
						||
| 
								 | 
							
								        (new self())->whereIn('name', $delete)->delete();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 各栏目[模型] 可展示字段列表
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function showFieldList(): array
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $list = self::alias('amf')
							 | 
						||
| 
								 | 
							
								            ->leftJoin('archives_category ac', 'ac.model_id = amf.model_id')
							 | 
						||
| 
								 | 
							
								            ->field('amf.*, ac.id as category_id, ac.title as category_title')
							 | 
						||
| 
								 | 
							
								            ->where('amf.status', self::COMMON_ON)
							 | 
						||
| 
								 | 
							
								            ->where('ac.id', '>', 0)
							 | 
						||
| 
								 | 
							
								            ->select();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $res = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $list = $list->toArray();
							 | 
						||
| 
								 | 
							
								        foreach ($list as $item) {
							 | 
						||
| 
								 | 
							
								            if (!isset($res[$item['category_id']])) {
							 | 
						||
| 
								 | 
							
								                $res[$item['category_id']] = [];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $res[$item['category_id']][] = $item['name'];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $res;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |