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 app\index\controller; use think\Controller; 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 app\admin\controller; 3 use think\Controller; 4 use app\admin\model\Cate as ModelCate; 5 6 use app\admin\controller\Base; 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 app\admin\model; 3 use think\Model; 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[]=