YII2框架动态创建表模型

在YII2中,每个表对应一个model类

在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表;

如果要在程序里用实例化引入这些model类,估计又是N个use引用,而且还需要写查询方法。

所以铁牛在使用过程中,就思考能否创建动态表模型来应用到我们的开发中。

代码见下:

namespace backend\classes;
//创建动态表模型
//在使用调用某些表数据的时候,勿需创建模型既可调用表数据,生成select
//$select= new SelectMade(‘bus_department‘,[‘id‘,‘department‘],‘sort‘,‘department‘,‘department‘);
//$department=$select->dropdown();
class SelectMade extends \yii\db\ActiveRecord {
    static $table;
    private $field;
    public $model;
    public $order;
    public $count;
    public $selectId;
    public $extends;
    public $selectName;
    public $itemid;
    //$table String 表名称
    //$field Array 要查找的字段  egg:[‘id‘,‘department‘]
    //$order String 排序字段
    //$selectName String 下拉列表的名称
    //$selectId String 下拉列表的ID
    //$itemid   Int 自增列序号或主键值
    //$extends 下拉列表的扩展属性 ‘egg:<select $extends></select>
    public function __construct($table,$field,$order,$selectName,$selectId,$itemid=‘‘,$extends=‘‘) {
        self::$table=$table;
        $this->field=$field;
        $this->order=$order;
        $this->selectId=$selectId;
        $this->extends=$extends;
        $this->selectName=$selectName;
        $this->itemid=$itemid;
        parent::__construct();
    }
    //定义动态表名词,数据来自于初始化类时
    public static function tableName(){
        return self::$table;

    }
    //数据查询
    public function query(){
        //获得相应的下拉的数组
        $this->model=$this->find()
                ->select($this->field)
                ->orderBy($this->order)
                ->asArray()
                ->all();
       //获得记录的条数,为后续统计服务 ,目前我是预留着,为后续JSON做准备。
        $this->count=$this->find()
                ->select($this->field)
                ->orderBy($this->order)
                ->count();
    }
    //动态生成下拉菜单
    //return String
    public function dropdown(){
        $this->query();
        $dropdown=‘<select id="‘.$this->selectId.‘" name="‘.$this->selectName.‘" class="easyui-combobox" ‘.$this->extends.‘>‘;

        foreach (array_values($this->model) as $k=>$v){
           $v=  array_values($v);
           $m=($v[0]==$this->itemid)?‘ selected="selected"‘:‘ ‘;
           $dropdown.=‘ <option value="‘.$v[0].‘" ‘.$m.‘>‘.$v[1].‘</option>‘;
        }
        $dropdown.=‘</select>‘;
        return $dropdown;
    }
    
时间: 2024-08-25 13:54:44

YII2框架动态创建表模型的相关文章

OrmLite动态创建表,一个实体类创建多张表的的偏招

在做一个Android的项目,因为使用数据库频繁,实体字段也比较多,于是打算采用ORM框架,发现OrmLite还不错,于是下了下来,打算使用. 没想到还没正式开工,就遇到问题了.我现在的一个需求如下, 我有一个实体类如下,代表聊天消息,现在要做的是针对每一个当前用户(userId)对应一个朋友(friendId)都要创建一个表.需求比较蛋疼,我本来想的是直接在加两个字段就搞定的,但是我们老大说要分表.没办法只能分表. public class ChatMessage{ public ChatMe

mybatis3动态创建表,判断表是否存在,删除表

1.mybatis3动态创建表,判断表是否存在,删除表 mapper配置文件: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/

Sql语句不能识别Go的解决办法(动态创建表的触发器)

问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下: System.Data.SqlClient.SqlCommand cmd; try { using (System.Data.SqlClient.SqlConnection newconn = new System.

MySql存储过程动态创建表并插入数据

最近做的一个项目,数据库用的是MySql,对于MySql不是很熟练,只是会简单的应用,毕竟简单的sql语句还是相通的,但是随着项目的深入复杂的sql语句开始慢慢多起来,其中一个小难点就是要根据当天的日期动态创建表,并且向其中插入数据. 具体逻辑可以理解为,先去数据库查询有没有当天的记录表,如果没有则创建表,然后执行当天的日志写入. Mysql的可视化工具我们用的是navicat,相对来说还是比较好用,当然没有sqlserver 那么人性化(很多快捷键不支持,操作累赘).下面我就来说一说用navi

C#解决 动态创建库、动态创建表

在11月10号.我们开始着手做高校平台这个项目,这个项目里面,有很多的子系统.权限系统.基础系统.考试系统-- 既然是高校平台,当然不只是一个学校用的,可以很多的学校公用.既然如此,每个学校所要保存的数据当然不可能存放在一个库中.一个学校一个库,那么有几个学校用呢?未知.库的数量得视情况而定.动态创建库可以解决这种问题. 当然,系统有很多.但是个人只是参与子系统的开发.在之前一直在考试系统里面打杂.这个项目分配下来了之后,我也就开始由打杂换了一种方式去打杂. 在做项目的过程中,任务的分配是非常明

存储过程动态创建表,以时间给表命名

存储过程动态创建表,以时间给表命名 create or replace procedure create_table as v_sql varchar2(2000); begin v_sql:='create table ' || upper('tablename')|| replace(to_char(sysdate,'yyyy-mm-dd'),'-','')|| replace(to_char(sysdate,'hh24:mi:ss'),':','')|| '( id number prim

python在sqlite动态创建表源码

代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.connect('mytest.db')cursor = conn.cursor()cursor.execute("create table person(name text, age text, address text)")print("table created") 原文

菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后生成相应的表. 须要动态配置的部分实例: 上图仅仅是一小部分,一个一个组合起来大概有三百多.每一项相应一个实体,显然不好,就算是依照规律归归类还是有不少.于是就想到了在执行期来确定这些东西.開始有尝试过动态编译生成实体类,后来发如今数据存取上都存在问题,由于是后来生成的,所以仅仅能用反射来获取.这样

菜鸟学SSH(十七)——Hibernate动态模型+JRebel实现动态创建表

项目用的是SSH基础框架,其中有一些信息很类似,但又不尽相同.如果每一个建一个实体的话,那样实体会太多,如果分组抽象,然后继承,又不是特别有规律.鉴于这种情况,就打算让用户自己配置要添加的字段,然后生成对应的表. 需要动态配置的部分实例: 上图只是一小部分,一个一个组合起来大概有三百多.每一项对应一个实体,显然不好,就算是按照规律归归类还是有不少,于是就想到了在运行期来确定这些东西.开始有尝试过动态编译生成实体类,后来发现在数据存取上都存在问题,因为是后来生成的,所以只能用反射来获取,这样一来无