手记

ThinkPHP基础篇(模型篇)

视图和 模板
视图view :为用户展示界面 通常的view层是一个界面 为用户展示数据
在index的控制器中 return view() 这个时候默认返回的index模块中view中的index.html 如果这个文件不存在就会报错
return view() ;
                 参数 第一个是访问的路径 view()方法中可以添加参数 例如 view("upload") 就会去找view中的upload的文件  不传默认是view中的index
                参数  第二个参数是我们传递的值 是一个数组的形式 在目标文件中 我们可以使用{$参数名} 来接受
                  view中接受的参数 {$a} 为什么可以使用大括号来接受呢?在配置文件中,配置了开始标签{和结束标签},有这2个标签可以自定识别他转换为对用的php
                                代码,这个配置是可以改变的,{ } 这个里面接受$a变量的时候左右是不可以有空格的,配置文件中也定义了可以使用这个接受一些常量,还有我们也可以使用这个
                                调用系统变量,比如Servier中一些信息,还可以获取请求中的一些值,还有cookie session
                                view中接受的变量是可以再次调用方法来执行一些操作的,方法的操作是 |来跟上方法名来处理的
                                {$a|方法名}  这样直接调用时默认的方法的第一个参数是$a 但是如果方法的参数有好几个,变量的位置不在第一个怎么办?
                                我们就使用站位的方式  {$a|方法名='参数1','参数2',###} 使用三个#号来占位这个方法对应的位置
                                另外,这个变量是可以参与计算的{$a+$b}的方式直接计算
                                在HTML中,使用的注释<!--注释文字-->  我们可以使用模板注释 {/*这里是view的注释*/},这样查看源码的的方式是看不到注释的
还可以这样用
               可以使用$this->fetch() / $this->fetch("目标路径") 的方式,使用这个方法的好处是可以使用 $this->assign('a',100);的方式来传递值
               使用$this->fetch()这个方法需要注意的是 use think\Controller 然后使用继承Controller
                这样就还有一个方法,但是不计划使用 $this->display()方法 使用的参数是一样的 和上面这个是一样的 ,但是不用传递第一个参数,第一个参数是指定访问的路径文件,上面那个不传有默认的view,但是不存在就会报错, 这个是不需要存在的,因为他已经和view中的index没什么关系了,脱离了 MVC框架的设计 ,所以不用他,代码多了维护的成本比较大
            控制器中向view中就是HTML中传递值的过程,{$a}的方式来接受变量值

           _STATIC_ _JS_ _CS_ 
模板的循环标签
            我们可以在控制器中直接传递list过来
            在view中怎么接受呢 volist
            {volist name='lsit' id='vo'}
            上面的name就是传递值使用的key 这是一个循环的标签,把每个值依次赋值在id='vo'中
            我们可以通过vo来取值 id就是指定变量值的
            <p>{$vo.name}</p>  引用vo 直接输出每个vo中的名字属性
            {/volist}
            //高级用法
            我们可以继续指定offset=2   就是说我们需要从数组的第2个索引位置开始遍历
            length可以指定长度    mod='2' 拿到当前的位置来对2取余,这个我想到了在android中设置列表适配的时候
            我们会对2取余来判断当前的位置,在商品列表的那个地方,显示的第一个和第二个的view有点不一样,android中
            是拿到适配器中当前位置的position来取余的,这里更简单,一般用来列表排版
            如果;list为空,我们是可以在加上一个empty="没有数据"
            empty是不能直接使用标签的,但是他可以接受的是一个变量,我们可以传递过来一个标签
            $empty="<p>空的数据</p>"
            然后直接在empty="$empty"
            我们也可以使用php模板
            在上面直接定义 {php}$empty ="这里直接使用html的标签";{/php} 或者直接使用php的写法
            <?php  $empty ="这里直接使用html的标签";  ?>这样也是可以的

            {volist }
            这个中间还有一些内置的变量
            $i 当前的索引位置 这个是默认的,但是如果有冲突我们是可以定义它的  在{volist key="s"}
            然后$s 就是替换了$i的功能 ,其实不写就是默认的key='i'

            {/volist}

            foreach标签
            //基本用法
            {foreach $lsit as $vo}
            <p>{$vo.name}</p>
            {/foreach}

            //更加深入的使用
            {list name='list' item='vo'}
            <p>{$vo.name}</p>
            {/foreach}
            这个是和上面的效果一样的

            for 循环

            {for start="1" end="10"}
            <p>{$i} </p>
            {/for}

            每次+2
            {for start="1" end="10" step="2"}
            <p>{$i} </p>
            {/for}

            里面的$i是可以换的 name="k"
            {$k}

            可以在建立循环的列表
            <ul>
            {for start="1" end="10" }
            <li>$i</li>
            {/for}
            </ul>

            比较的标签

            {eq name='a' value='10'}  ///////value='$b'
            //这里是比较的相同的时候
            {else/}
            //不相同的时候
            {/eq}

            上面的就是一个判断的标签 还有一个 equal 和eq一样样的
            对应的标签是neq  notequal
            上面的判断是相同的或者不相同的情况
            判断> gt  >= egt
            判断< lt  <= elt

            怎么判断多次呢?条件判断标签 就是使用switch
            {switch name="Think.get.level"}
            {case value="1"}<p>一级 <p> {/case}
            {case value="2"} <p>2级 <p>  {/case}
            {case value="3"} <p>3级 <p>  {/case}
            {case value="4"} <p>4级 <p>  {/case}

            {/switch}
            格式化后张这样
            {switch name="Think.get.level"}
            {case value="1"}<p>一级
            <p> {/case}
                {case value="2"}
            <p>2级
            <p> {/case}
                {case value="3"}
            <p>3级
            <p> {/case}
                {case value="4"}
            <p>4级
            <p> {/case}

                {default /}
            <p>游客</p>
            {/switch}
            {range name='' value='1,100' type='in' }范围的判断;这里注意的是type = in notin between包含其实和结束值的 notbetween

            {defined name=''}判断某一个值是否定义

            if标签 {if condition='($Think.get.level==1) AND (第二个条件)'}//定义条件

            模板的布局 包含和继承    以后再看一次
模型篇
     数据库操作 thinkPHP模型(对db进行了又一次的封装)             

数据库的链接操作

            use think\Controller;
            use think\Db;
            继承Controller 
            Db::connect();这里其实并没有进行链接 只是惰性加载 只有在执行具体额操作的时候才会进行连接
            这里的参数可以可以传递一个数组进行配置 
查询数据
          选择表 我们可以使用table的方法和name方法 使用name的方法我们可以不需要添加数据库的前缀,如果有前缀并且数据库配置中配置了前缀
          这里是用table 或者是 name 使用name是可以直接传递数据的名字,而不是加上配置文件中配置的前缀的
          是使用table切必须添加前缀的
          使用name其实是自动去配置文件找有没有前缀的,然后添加上去的
查询sql
          $res = Db::query('select * from user where id=?', [1]); 第二个参数对应第一个参数中的? 位置一一对应
select
          $res   = Db::table('user')->select();  使用table的方法选择数据库
          $res   = Db::table('user')->where(["id" => 10])->select(); 可以添加条件 
          返回结果是二维数组,如不存在返回一个空的数组
find
           $res =    Db::table('user')->where(['id'=>1  ])->find(); 
           使用find 方法 返回的结果是一个1维数组
           这个方法只返回一条记录 在这里我们需要添加where条件 如果结果不存在 返回的是一个null值
           如果没有条件,默认排序是id最小的
value
            $res=  Db::table('user')->value('name');
            我们想得到数据库某个字段的值  也可以加where条件  只返回一条数据 如果结果不存在 返回null
column
            $res = Db::table('user')->column('password', 'name'); name就是对应的key值
            查询这一列的数据 返回的是一个一维数组  可以传递2个参数 如果存在
            第二个参数对应的就我们查询出来结果的key值 也是可以添加条件的
            如果结果不存在 返回的是空数组
添加数据
             /**
              * 定义变量 选中数据库的一张表
             */
        提前选择数据表  $db = Db::name('user');  
insert 返回值是插入记录的条数
    $db->insert([          'name' => $key,
                           'password' => md5($key)
                            ]);
           返回值是插入记录的条数    
insertGetId 返回的结果是插入数据的自增id
           $res = $db->insertGetId([
                                      'name' => $key,
                                      'password' => md5($key)

                                  ]);
             返回的结果是插入数据的自增id
insertAll
                    /**
                     * 添加数据: insertAll
                     * 多条数据
                     * 传递的参数是一个数组
                     * 返回插入数据成功的函数
                     * 我们可以拿着个返回的行数和数据的长度做比较,然后判断数据是不是全部插入了
                     */
                    $data = [];
                    for ($i = 0; $i < 10; $i++) {
                        $key = '';
                        for ($ii = 0; $ii < 11; $ii++) {
                            $key .= $pattern{mt_rand(0, 9)};    //生成php随机数
                        }
                        $data[] = [
                            'name' => $key,
                            'password' => md5($key)
                        ];
                    }
                    //准备好数据了
                    $res = $db->insertAll($data);
数据更新
        $db = Db::name('user');   
update
                    /**
                     * 更新数据: update
                     * 这个更新方法必须添加where条件
                     * 返回的结果是更新的条数
                     * 如果没有更新,则返回0
                     */
                    $res = $db->where([
                        'id' => 1
                    ])->update([
                        'name' => '13810916949'
                    ]);
setField
                    /**
                     * 更新数据: setField
                     * 上面那个方法可以更新多个字段
                     * 如果我们只是简单的更新一个字段的时候
                     * 可以使用setField方法
                     * 返回值是影响的行数
                     * 没有被影响返回0
                     */
                    $db->where(['id' => 2])->setField('name', '13546123446');
setInc
                    /**
                     * 更新数据: setInc
                     * 自增 这个id下的num字段每次自增1
                     * 可以传递第二个参数指定每次增加的数
                     * 返回值的影响数据的行数
                     */
                    $db->where(['id' => 3])->setInc('num');
setDec
                    /**
                     * 更新数据: setDec
                     * 和setInc方法一样,自减
                     */
                    $db->where(['id' => 4])->setDec('num');
数据库删除
    $db = Db::name('user');            
delete
                    /**
                     * 删除数据: delete
                     * 返回受影响的行数
                     * 当没有删除数据的时候返回的是0
                     * 如果删除的条件是主键 不需要where 直接在delete方法中传入参数主键
                     */
                    $res = $db->where(['id' => 1111])->delete();
条件构造器
                /**
                 * 条件构造器
                 */

                public function sqlbuild(){
                    $db = Db::name('user');
                    /**
                     * EQ         =
                     * NEQ        <>
                     * LT         <
                     * ELT        <=
                     * GT         >
                     * EGT        >=
                     * BETWEEN    BETWEEN    * AND *
                     * NOTBETWEEN NOTBETWEEN * AND *
                     * IN         IN (*,*)
                     * NOTIN      NOT IN (*,*)
                     */
                    /**
                     * 可以连续添加where
                     * 第二个可以使用whereor方法
                     */
                   $sql= $db->where(
                       [
                           'id' => ['EGT',1]//条件是id>=1

                       ]
                   )->buildSql();

                }
总结
            数据库的操作无外乎就是增删改查
          1.  数据库的连接在thinkPHP中也是很简单的
            Db::connection方法是可以直接连接数据库的
            这个方法我们一般不使用,因为当我们执行其他的操作方法的时候,它会自动连接好了
          2.  在操作数据之前我们使用Db::name(表名) 这个方法来选择我们要操作的数据库表 ,这个返回的对象我们是可以直接操作的,另外还有一个table的方法
            ,这个方法需要传入的表名必须要添加前缀的,如果配置了前缀,使用name的方法会自动添加上前缀的名字
           3. 增:
            就是插入的方法 insert
            参数是一个对象的数组形式 [
            'name'=>'',password=>''
            ]  这个方法的返回值是插入记录的条数
            还有一个insertGetid
            这个方法操作是和上面的方法一样的额,返回值是操作的id
            还有一个insertAll方法,这个方法一般用来插入多条的数据 ,传入的参数是一个数组,返回的数据是插入的条数,我们可以拿着这个条数来判断当前的数据库是不是完全插入了数据
            和数据源做比较长度
         4.   删:
            删除相对来说就比较简单了一点就delete方法 ,这个方法注意的是要添加条件
         5.   改:
            就是执行数据库的更新操作 update
            简单的执行更新一条数据,我们添加where条件和一个要改变的参数就可以    $res = $db->where([
                                                           'id' => 1
                                                       ])->update([
                                                           'name' => '13810916949'
                                                       ]);
            我们还可以更新某个字段 setField              $db->where(['id' => 2])->setField('name', '13546123446');
                      也是比较简单的,返回的是影响的行数,没有被修改直接返回0

         6.   查:
            数据库的查询操作:select
            单一的一个结果查询,适应的方法是find 这个方法返回的是一个一维数组,查不到就返回空数组
            查询一个字段的值适应的方法是value ,返回一条数据,查不到就是null
            查询一列的数据适应的是column方法,返回的是一个一维数组,这个方法的第一个参数是我们查询的列,这个方法还可以添加第二个参数,第二个值会以
            key的形式返回给我们
            查询我想着最多的还是使用的select的方法,返回的值是一个数组

          7.  还学了一点条件构造器的知识:    $sql= $db->where(
                                     [
                                         'id' => ['EGT',1]//条件是id>=1

                                     ]
                                 )->buildSql();
                                 这个以后要是用到了再来看看视频 https://www.imooc.com/video/15179/0
                             现在需要记住一点就是where是可以重复使用的

模型

     为什么使用模型?例如:在操作的时候一个用户的信息可能要操作的数据表有多个(user userinfo表) 在控制层中每次操作都执行两个数据库表的操作
     很不方便,我们可以创建模型,在模型中定义一个方法来操作数据库表,可以达到复用的效果         

什么是模型??

            简单的来说 模型就是项目中MVC结构的M层 model层

创建模型 在model模块中创建

            :model 的命名: 直接对应我们的数据库表名,
            然后继承下thinPHP的model,
            我们是可以直接调用数据库的数据,是不是方便了好多

            user表 ====> User.php

使用

            创建一个User.php的文件  命名空间写好,不然引用不到
            use think\Model; 继承下Model
            在使用的地方 use app\index\model\User 
            然后使用 User::get(传入id) 验证是否可以使用模型 
            1.我们可以使用 User::get()
            2.$user = new User;
            3.$user = Loader::model("User") 不需要引用
            4.$user = model("user")   不需要引用
            建议前2种方法 

使用模型查询数据

           1.$res = User::get(1) //参数是id 
                $res -> username  
                //参数可以这样传 闭包函数 
                User::get(function($query){
                $query->where("id","eq",1)
                ->field("id,username")
                }); 
           2.User::where("id",1)  //条件 
           ->field("id,username") //指定查询的属性
           ->find()
           3.获取多条记录 
            User::all("1,2,3,34,54,122") 传递的参数是查询的主键id  
            返回的结果是一个user对象的集合 
            User::all([1,23,43,43,2,34]) 传递的参数是查询的主键id  
            User::all(function($query){
            $query->where("id" ,">",5)
            ->field('''''')
            })
           4.User::where("id",">",10)
           ->链式操作 
           ->select()
            返回的结果是一个user对象的集合 

使用模型添加数据

           1. User::creat([
             "username" => "name"
             "password" => "password"
             ],true); 排除不想添加的字段 
             User::creat([
                              "username" => "name"
                              "password" => "password"
                              ],["username"]); 指定添加的字段 

            2. $user = new User;                 
             $user->username="name";
             $user->password="dfdsaf"
             $user->save()
             $user->id()获取添加的数据的id 
            3.   $user->save([
            "username" => "name"

            ])  
            //allowField(true) 这个可以排除不想添加的字段 参数也可以是一个数组
             $user->allowField(true) ->save([
                            "username" => "name"
                            "不存在的字段" => "324"
                            ])  
            4.saveAll([
            [],
            []
            ])     

            $user = new User;                 
                             $user->   saveAll([
                                                       [
                                                       "username" => "name"
                                                       "password" => "2312"
                                                       ],
                                                       [
                                                       "username" => "name2"
                                                       "password" => "2312"                                                        "password" => "2312"
                                                       ]
                                                       ])     

使用模型更新数据

            1.update 
            2.借助 get() save()
            3.save 方法 指定条件         

使用模型删除数据

            1.destroy() 参数可以传入主键的值 也可以是闭包函数 
            2.delete {
             可以先获取对象后删除 
             也可以添加where条件
            }

模型聚合操作

            User::count()
            User::where("id",">",2)
                ->count(); 
            1.count 条数 
            2.max("num") 一个列中的最大值 
            3.sum("num") 求和 
            4.avg("num") 平均值    
            5.min 最小值 
            6.

模型获取器

         在模型中定义方法 getSexAttr($val){  对应属性字段   获取器的设置 
         switch ($val){
           case "1":
           return "男"; 
           break;
           case "2":
           return "女";
           break;
           default:
           return  "未知";
           break;
         }
         }
4人推荐
随时随地看视频
慕课网APP