zoukankan      html  css  js  c++  java
  • tp5 使用技巧(持续更新中...)

    tp5 使用技巧(持续更新中...)

    1、自动写入时间 create_time和update_time

        使用save方法才行,如果使用insert方法的话,是不生效的,前者走的是model,后者走的是query

    2、过滤字段 allowfield和strict方法
        allowfield()方法配合save方法,
        strict()方法配合insert方法,与上一条同理

    3、save和update的区别

         save和update本身也没什么区别,更新条件也不局限于主键id,只不过是update 和create一样,是model中的静态方法,而save不是

    4、跨模型,有点像是远程一对多关联的替代

    1 $list = self::with(['album','album.Image'])
    2     ->where('type','neq',2)//合伙人不显示
    3     ->where($where)
    4     ->order("type DESC,login_num DESC")
    5     ->page($page, $pageSize)
    6     ->select();

     5、模型事件,参考文档:tp5的事件

     1 //修改事件
     2 protected static function init()
     3 {
     4    //如有变更积分
     5     self::beforeUpdate(function ($row) {
     6         $changedata = $row->getChangedData();
     7         if (isset($changedata['score'])) {
     8             $origin = $row->getOriginData();
     9             ScoreLog::create(['user_id' => $row['id'], 'score' => $changedata['score'] - $origin['score'], 'before' => $origin['score'], 'after' => $changedata['score'], 'memo' => '商城分红改变积分']);
    10         }
    11    });
    12 }

    调用方式如下:

    1 $score = bcmul($bonus,$vvv);
    2 if ($score) {
    3     $row = $user_model->get($kkk);
    4     $data = $row->getOriginData();
    5     $score_before = $data['score'];
    6     $row->validate(false)->allowField(true)->save(['score'=>$score + $score_before]);
    7 }

     如果想要在模型事件里增加传参,只需要往$row对象里多赋值一个属性就好了

    6、全局查询范围

    在手册中,从5.0.4开始,支持各种事件查询,包括add、update、delete以及select、find,示例4就是一个简单的before_update事件,但是before_select不知为何没效果(有效果后续再改,哈哈)

    所以,遇到该模型查询条件一致的时候,就用到了base()方法

    1     // 定义全局base
    2     protected function base($query)
    3     {
    4         $query->where('1=1');
    5     }

    在手册中,也有关于全局查询范围的说明:查询范围

    在此补充一下,之前遇到一种情况,就是一开始没加delete_time,后来又加上了,但是接口没加啊,如果每个查询接口改太费劲了,因为还有关联,如果查询都是从model获取数据的话,那还简单,但是遇到model一多也费劲,所以全局查询范围的优点就显示出来了,可以在接口model继承的basemodel中,统计增加一个base方法(起名就是base,别的不认),代码如下:

     1 /**
     2  * 设置全局查询范围
     3  * author:cyf
     4  * time:2020-01-03 20:39
     5  * @param $query
     6  */
     7 public function base($query)
     8 {
     9     $fields = $query->getTableFields();
    10     if (in_array('delete_time',$fields)) {
    11         $query->where($query->getTable().'.delete_time is null or '.$query->getTable().'.delete_time = 0');
    12     }
    13 }

    备注:$query->getTableFields();//获取当前数据表字段信息,$query->getTable();//获取当前数据表名称,带前缀的,详细可以(new query())->getTable()查看

  • 相关阅读:
    设计模式——策略模式
    LeetCode
    平凡世界里的万千思绪
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/cyfblogs/p/10235226.html
Copyright © 2011-2022 走看看