zoukankan      html  css  js  c++  java
  • 初识thinkphp(5)

    这次主要内容是模型的基本操作

    0x01:什么是模型

    通过手册的阅览,笼统的说就是,把打开数据库等操作在另一个php文件中进行

    以及对变量的规则具体细节,查询,取值等操作进行定义,方便在控制器中直接使用。

    0x02:模型的使用

    在index目录下创建与controller同级的目录model

    创建php模型文件,并调用thinkModel文件

    <?php
        namespace appindexmodel;
        use thinkModel;
        class User extends Model{
            protected $table = 'think_user';
            protected function getBirthdayAttr($birthday){
                return date('Y-m-d', $birthday);
            }
            protected function setBirthdayAttr($value){
                return strtotime($value);
            }
            protected function scopeEmail($query){
                $query->where('email', '4396@qq.com');
            }
        }
    
    ?>

    table是获取数据库变量,之前在applicationdatabase.php文件中已经对打开数据库进行关联了。

    getBirthdayAttr函数中命名规则 get + 名称 + Attr

    这样能在控制器中直接调用 echo birthday变量 而不用再用date()函数进行转换

    setBirthdayAttr函数中命名规则 set + 名称 + Attr

    这样在控制器中修改birthday不用调用strtotime()函数,而是直接的user->birthday = 'xxxx-xx-xx'

    scopeEmail函数中命名规则 scope + 名称

    这样在查询的时候不用再写sql语句或者thinkphp自带的sql调用,就可以查询相关联内容

    注意:这里的函数中“名称”即使变量名,如果不是变量名,会出现错误。

    0x03:在控制器中模型的调用

    对于数据库的操作无意就是增删改查

     public function add()
        {
            $user           = new UserModel;
            $user->nickname = 'sijidou';
            $user->email    = 'sijidou@qq.com';
            $user->birthday = "1998-10-30"      //strtotime('1998-10-30');
            if ($user->save()) {
                return 增加成功信息;
            } else {
                return $user->getError();
            }
        }

    增加无疑就是new一个模型,注意这里的对象是模型里面的类名,这里因为控制器名字也叫User于是用引用修改了下模型中的User的名字

        use appindexmodelUser as UserModel;

    这里的birthday实则调用了模型中的setBirthdayAttr函数,如果没有setBirthdayAttr函数,信息可以存储,但在最后输出时候时间固定是1970-01-01的默认值(我这里是这样的)

        public function update($id){
                $user = UserModel::get($id);
                $user->nickname = 'tudou';
                $user->email = '4396@qq.com';
                $user->birthday = '1999-4-5';
                $user->save();
            }
    
            public function delete($id){
                $user = UserModel::get($id);
                if($user){
                    $user->delete();
                    return '删除用户成功';
                }
                else{
                    return '删除用户不成功';
                }
            }
            public function search($email){
                $list = UserModel::scope('email', $email)->select();
                foreach($list as $user){
                    echo $user->nickname . '<br/>';
                    echo $user->email . '<br/>';
                    echo $user->birthday . '<br/>';
                }
            }

    改删查中,改和删都用到的是get,对应的默认调用了getBirthdayAttr函数,而查中的scope则调用的是scopeEmail函数,如果将email变量该为nickname并在模型中添加相应的scopeNickname($nickname)那么可以根据nickname的值进行查询。

    0x04:与view之间的交互

    这里我使用的官方提供的html模板,源码就不贴了,反正就是个form表格,和一点css。

     这里将控制器的内容传到视图里面去,需要用view方法,且对应打开的视图文件名称默认为方法名称

     

    访问的路径为http://192.168.60.132/index/user/create

    这里对add()函数进行修改

    input函数这里是thinkphp特有的参数,主要功能是用来修改将代码赋值内容改为用接收post传参这里的"post."中的'.'主要是用来匹配所有的参数,如果具体到某一个可以"post.nickname"

    allowField(true)是thinkphp中特有的函数,功能是用来过滤非数据表中的数据

    validate()函数是tinkphp中特有的函数,功能主要是用来校验post过来的数据是否符合规范。

    validate的内容在validate的模板中定义(在5.1版本中不可这样定义了,直接在控制器下写个函数就行)

    validate模板路径  .indexvalidateUser.php

    内容为

     

    用rule来给键值对规定

    require是必填

    min:5是长度最小为5

    email是检测是否符合邮箱规范

    dateFormat:Y-m-d检测是否符合日期规范(数值不在月份日份以内也不行)

    checkMail自定义方法:$value => email参数 $rule => 'qq.com'规则,用if语句判断

    preg_match是用于正则表达式匹配的比较函数

    0x05:关联与输出

    手册讲的挺多的,无非就是一对一、一对多、多对多

    一对一:在一个中用this->hasOne(另一个模型名),另一个用belongsTo(前一个模型名)

    一对多:在一个中用this->hasMany()来定义额外的(),其他与一对一一样

    多对多:与一对多差不多,即在每个模型中的belongToMany(对应模型1,对应模型2,。。。)

    在add中如果要对关联的模型修改

    当前模型->关联模型->关联模型变量 = 内容

     保存时候用(这里用的示例函数,作者懒不想测试了,以后用得上再使用)

    模型输出

    无非就是操作器里面输出或者跳转到视图里面输出

    跳转到视图用view('视图文件名字'),一般是在controller同级目录下的view文件里面

    不带参数默认与方法名字相同。

    在操作器内输出用var_dump也行,return也行

    这里还可以用ToArray()来将数组输出,hidden([变量名])来隐藏相应变量输出,visible([变量])来指定有且只有定义的变量输出。

    总结:这节内容差不多就这样,之前写的几篇示例我觉得太详细了,以至于像教科书般的流水账,写博文主要还是记笔记,记重点,所以这里比较精简。以及最后的关联相关的内容并没有测试,等到以后实际操作时候再用吧。最近要期末了,又没期末复习,又没写博客,真是太颓废了。

  • 相关阅读:
    oracle expdp和impdp常用命令选项
    oracle expdp导出远程数据到本地
    oracle目录操作
    反射
    设置查询对话框的F7
    Uncaught TypeError: timeout.close is not a function. when try to use clearInterval
    timestamp to time 时间戳转日期
    react+antd 选项卡切换
    react antd Warning: must set key for <rc-animate> children
    微信企业号报Error: echostr校验失败,请您检查是否正确解密并输出明文
  • 原文地址:https://www.cnblogs.com/sijidou/p/9195986.html
Copyright © 2011-2022 走看看