美文网首页
ThinkPHP5数据模型

ThinkPHP5数据模型

作者: _乐哥_ | 来源:发表于2017-08-24 19:01 被阅读0次

    1 获得模型

    先定义模型 User

    User::get(1);
    //获得id=1的User

    $user2=new User;
    $user2::get(2);
    //获得id=2的User

    $user3=Loader::model("User");
    $user3::get(3)
    //获得id=3的User
    //需要use think\Loader
    //可以多个模型

    $user4=model("User");
    $user4::get(4)
    //获得id=4的User
    //助手函数,不需要use think\Loader

    2 模型查询

    $user=User::get(1);
    $user=$user->toArray();
    //获得id=1的User
    //获得数据

    $data=User::get(function($query){
            $query->where("id","eq",1);
    })
    $data=$data->toArray();
    //获得数据

    $data=User::where("id",10)
    ->field("id,name,age")
    ->find()
    //链式操作

    $data=User::all("1,2,3");
    foreach($data as $val){
        dump($val->toArray());
    }

    3 模型添加

    User::create([
    'name'=>'smith',
    'age'=>30,
    'email'=>'smith@qq.com'
    ])

    User::create([
    'name'=>'smith',
    'age'=>30,
    'email'=>'smith@qq.com',
    'book'=>'thinkphp'
    ],true)
    //这里true可以防止插入不存在的book字段而报错

    $user=new User;
    $user->name='Joy';
    $user->age=24;
    $user->save();

    $user=new User;
    $user->save([
    'name'=>'robot',
    'age'=>22
    ])

    $user=new User;
    $user
    ->allowField(true)//过滤不存在的数据字段
    ->save([
    'name'=>'robot',
    'age'=>22,
    'book'=>'c#'
    ])

    $user=new User;
    $user
    ->allowField(['name'])//只插入name字段值,并且过滤不存在的数据字段
    ->save([
    'name'=>'robot',
    'age'=>22,
    'book'=>'c#'
    ])

    同样还有
    $user->saveAll($list)方法,插入多条数据,可以仅仅部分字段,返回每个model

    4 更新数据

    User::update([
    'id'=>1,
    'name'=>'Gog'
    ])
    //更新ID=1的数据

    User::update([
    'id'=>1,
    'name'=>'BOOB'
    ],['id'=>2])
    //更新ID=2的数据

    User::update([
    'id'=>1,
    'name'=>'Higo'
    ],function($query){
        $query->where("id","=",5)
    })
    //更新ID=5的数据

    User::where("id","=",6)
    ->update([
    'name'=>'Clop'
    ])
    //返回更新的行数,如果同样的代码再次执行,返回0

    $user->User::get(1);
    $user->name='Tom';
    $user->save();
    //返回更新的行数,如果同样的代码再次执行,返回0

    $user->new User;
    $user->save([
    'name'='Jack'
    ],['id]=>9])
    //返回更新的行数,如果同样的代码再次执行,返回0

    $user->new User;
    $user->save([
    'name'='Jack'
    ],function($query){
    $query->where('id','<','10');
    })
    //更新<10的

    $user->new User;
    $user->saveAll([
        ['id'=>1,'name'=>'Pick''],
        ['id'=>2,'name'=>'Tomas']
    ]);
    //更新多个,刷新同样执行

    5 删除数据

    User::destroy(1);
    //返回删除的行数,如果同样的代码再次执行,返回0

    User::destroy(['id'=>1]);
    //效果一样

    User::destroy(function($query){
        $query->where('id','<',5);
    });
    //删除<5的所有user

    $user=User::get(6);
    $user->delete();

    User::where('id',8)
    ->delete();

    6 聚合操作

    User::count();
    统计数量

    User::where('id','>',5)->count();
    //统计

    max()//取得最大值

    min()//最小值

    sum()//求和

    avg()//平均值

    7 模型显示属性格式化

    在model代码中:User.php,定义个性别获取器
    public function getSexAttr($val){
        switch($val){
            case '1':
                         return '女';
                         break;
             case '2':
                         return '男';
                         break;
             default:
                        return '未设置';
                        break;
        }
    }

    设置后,模型中性别栏自动显示为 男 女 或 未设置

    $data->User::get(1);
    dump($data->toArray());
    //这样输出的结果是格式化后的数据

    如果希望还是显示数字0,1,2使用的是:
    $data->User::get(1);
    dump($data->getData());

    8 模型修改器

    在model代码中:User.php,定义个密码修改器

    public function setPasswordAttr($val){
        return md5($val);
    }

    这样在插入操作的时候,不需要显示在代码中加密,它会自动修改;

    特别的,如果这个方法有第二个参数。

    /*
    *  User类密码修改器
    * @param $val 表示传入的密码值
    * @param $data 表示传入的整个model
    */
    public function setPasswordAttr($val,$data){
    //    $data['age'] //得到年龄
    }

    9 模型自动完成

    在model代码中:User.php,定义个auto数组,里面填上需要自动完成的字段;

    protected $auto=['time'];

    再定义一个set方法

    public function setTimeAttr()
    {
        return time();
    }

    protected $insert=[];//只在插入有效

    protected $update=[];//只在更新有效

    10 模型时间戳

    在model代码中:User.php,有两个字段create_time和update_time

    protected $autoWriteTimestamp=true;

    当前模型的时间会自动填写。

    如果字段名称不是这两个则需要在模型中声明,假设当前字段名为create_on和update_on

    则需要补充代码如下

    protected $createTime='create_on'; //这里填写的是字段名,如果是填写false,表示不开启
    protected $updateTime='update_on';

    这样就好了

    11 软删除

    在数据中添加字段delete_time,允许为null

    ①在模型中引入函数
    use traits\model\SoftDelete;

    ②在模型体中
    use SoftDelete;

    ③此时如果只选 User::destory(1),数据不直接删除,而是记录了deleteTime

    ④虽然数据不删除,如果使用User::get(1),返回的是Null

    ⑤如果需要获得软删除的数据需要User::withTrashed(true)->find(1);

    ⑥如果只想要软删除的数据User::onlyTrashed()->where();

    同样如果字段名称不是delete_time,也是rotected $createTime='delete_on';的设置

    如果设置了软删除,要真的删除

    方法①
    User::destory(1,true) //直接删除

    方法②
    $user=User::get(1);
    $user->delete(true);

    如果要去掉软删除标志,则update 删除字段的时间为null即可

    相关文章

      网友评论

          本文标题:ThinkPHP5数据模型

          本文链接:https://www.haomeiwen.com/subject/ychjdxtx.html