zoukankan      html  css  js  c++  java
  • thinkphp5项目--企业单车网站(六)

    thinkphp5项目--企业单车网站(六)

    项目地址

    fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Website
    https://github.com/fry404006308/BicycleEnterpriseWebsite

    1、thinkphp数据库字段操作很多都支持直接数组方式

    $res=db('cate')->update($dataIn);

    2、数组的访问方式

    数组在控制器中是['']的访问方式

    if($v['pid']==$id) return ture;

    数组在视图界面是.(点)的访问方式

    <td >{if condition="$vo.level neq 0"}|{/if}<?php echo str_repeat('----',$vo['level'])?>{$vo.catename}</td>

    3、关于编程的教学

    直接按照书上的一章一章的讲,太无趣了。因为这样一章一章的书直接叫做参考手册好了,比之于直接叫做书的话。

    直接以项目起手,用到哪,讲到哪,整个项目做完,再来整个系统讲解所有知识点(可以结合项目的案例讲啊)。

    我教算法的经历,我自学编程的经历,学java,学php,都验证了这一点。

    4、控制器前置操作

    前置操作
    
    可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList 属性可以指定某个方法为其
    他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
    ['except' => '方法名,方法名']
    表示这些方法不使用前置方法,
    ['only' => '方法名,方法名']
    表示只有这些方法使用前置方法。
    示例如下:
    
    namespace appindexcontroller;
    use thinkController;
    class Index extends Controller
    {
        protected $beforeActionList = [
        'first',
        'second' => ['except'=>'hello'],
        'three' => ['only'=>'hello,data'],
        ];
        protected function first()
        {
            echo 'first<br/>';
        }
        protected function second()
        {
            echo 'second<br/>';
        }
        protected function three()
        {
            echo 'three<br/>';
        }
        public function hello()
        {
            return 'hello';
        }
        public function data()
        {
            return 'data';
        }
    }

    访问
    http://localhost/index.php/index/Index/hello
    最后的输出结果是
    first
    three
    hello


    访问
    http://localhost/index.php/index/Index/data
    的输出结果是:
    first
    second
    three
    data

    项目实例:

    无限分类中删除栏目的话删除所有孩子

    控制器:

     1 <?php
     2 namespace appadmincontroller;
     3 use thinkController;
     4 use appadminmodelCate as ModelCate;
     5 
     6 use appadmincontrollerBase;
     7 
     8 class Cate extends Base
     9 {
    10     //前置方法
    11     protected $beforeActionList=[
    12         'delChilden'=>['only'=>'del'],
    13     ];
    14 
    15     //删除无限分类的第二种方法:删除掉这个栏目及所有的孩子
    16     public function del(){
    17         //1、在前置方法里面删掉所有孩子
    18         //2、在当前方法里面删除这条数据
    19         $id = input('id');
    20         $res = db('cate')->delete($id);
    21         if($res){
    22             $this->success('删除栏目成功','cate/lst');
    23         }else{
    24             $this->error('删除栏目失败');
    25         }
    26     }
    27 
    28     //删除前删除所有的孩子
    29     public function delChilden(){
    30         //1、获取要删除孩子的栏目id
    31         $id = input('id');
    32         //2、在模型中找到这个id对应的所有孩子
    33         $modelCate=new ModelCate();
    34         $ids=$modelCate->getChilden($id);
    35         //3、在数据库中删除所有孩子
    36         if($ids){
    37             $res = db('cate')->delete($ids);
    38             if(!$res) $this->error('删除当前栏目的子栏目失败');
    39         }
    40         
    41     }
    42 
    43 }

    模型:

     1 <?php
     2 namespace appadminmodel;
     3 use thinkModel;
     4 
     5 class Cate extends Model
     6 {
     7 
     8     //获得指定id的所有孩子的数组
     9     public function getChilden($id){
    10         $data=$this->select();
    11         $res=$this->getChildenId($data,$id);
    12         // dump($res);die;
    13         return $res;
    14     }
    15 
    16     //获得指定id的所有孩子的数组
    17     public function getChildenId($data,$id){
    18         static $arr=array();
    19         foreach ($data as $k => $v) {
    20             if($v['pid']==$id){
    21                 $arr[]=$v['id'];
    22                 $this->getChildenId($data,$v['id']);
    23             }
    24         }
    25         return $arr;
    26     }
    27 }

    5、php递归使用

     1 /**
     2  * 无线分类重新排序:使得那些栏目的顺序是对的,父级栏目在子级标题之上
     3  * 这其实是一个再简单的递归也没有了,作为递归,访问标签页没有加
     4  * @param  [type]  $data  传入的栏目数组
     5  * @param  integer $pid   父级栏目id,顶级栏目的id为0
     6  * @param  integer $level 栏目等级,初始等级为0
     7  * @return [type]         排序好的栏目的数据
     8  */
     9 public function sort($data,$pid=0,$level=0){
    10     static $arr=array();
    11     foreach ($data as $k => $v) {
    12         //如果子级的父级id等于传传过来要查找的父级id,说明自己是这个父级id的孩子
    13         if($v['pid']==$pid){
    14             $v['level']=$level;
    15             $arr[]=$v;
    16             //在这个$data数组中去递归找它的孩子
    17             $this->sort($data,$v['id'],$level+1);
    18         }
    19     }
    20     return $arr;
    21 }

    还要注意这里的默认参数

    6、无限分类删除

    如果做无限分类的时候删除栏目的时候想删除这个栏目及所有孩子,算法思路如下

    1、递归找到它的所有孩子的id(这个挺简单的)

    2、用delete的批量删除主键的方法即可删除(查看手册里面的批量删除)

    Db::table('think_user')->delete([1,2,3]);

    7、静态数组使用

     1 //获得指定id的所有孩子的数组
     2 public function getChildenId($data,$id){
     3     static $arr=array();
     4     foreach ($data as $k => $v) {
     5         if($v['pid']==$id){
     6             $arr[]=$v['id'];
     7             $this->getChildenId($data,$v['id']);
     8         }
     9     }
    10     return $arr;
    11 }

    看声明,=array()

    看赋值,$arr[]=

  • 相关阅读:
    级联操作
    深入解析http协议
    http状态码
    数据库在一对一、一对多、多对多怎么设计表关系
    [转载]C#深拷贝的方法
    TraceSource记录程序日志
    .NET 垃圾回收与内存泄漏
    DevExpress GridControl使用方法总结
    DevExpress使用技巧总结
    Oracle 错误代码小结
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8861217.html
Copyright © 2011-2022 走看看