building-sign/app/model/ArchivesModelField.php

118 lines
3.3 KiB
PHP
Executable File

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