• thinkphp相关


    thinkphp相关
    1.thinkphp调试sql方法:echo M("table_name")->getLastSql();

    2. 条件查询设置多个条件参数的写法:
    (1). $result = M("table_name")->where(array("cloumns_name"=>$cloumns_value,"cloumns2_name"=>$cloumns_value2))->find();
    (2). $query = array();
    $query["cloumns_value1"]= array('eq', $cloumns_value1 );
    $query["cloumns_value2"]= array('neq', $cloumns_value2 );
    $result = M("table_name")->where($query)->select();
    3.插入数据
    $data = array("group_goods_detail_goods_id"=>intval($combine_goods_info["goods_id"]),"goods_id"=>intval($goods_Info["goods_id"]));
    M("group_goods_detail")->query("INSERT INTO `adm_group_goods_detail` (`group_goods_detail_goods_id`, `goods_id`) values('".$data[group_goods_detail_goods_id]."','".$goods_Info["goods_id"]."')");

    $result = GoodsModel::addGoods($basicInfo);
    =======================================================
    ThinkPHPConfconvention.php
    'DB_PREFIX' => 'adm_', // 数据库表前缀
    thinkphp中->table,->join 等函数里可以使用__PLATE_TYPE__ 会自动添加前缀转换成adm_plate_type
    注意:字符串的条件不会自动转换的,必须用全表名,如:->order('adm_recommend_house.order_num ')

    table方法指定的数据表需要完整的表名,但可以采用下面的方式简化数据表前缀的传入,例如:
    $Model->table('__USER__')->where('status>1')->select();
    http://document.thinkphp.cn/manual_3_2.html#table
    =======================================================
    表达式查询
    上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,查询表达式
    的使用格式:
    $map['字段1'] = array('表达式','查询条件1');
    $map['字段2'] = array('表达式','查询条件2');
    $Model->where($map)->select(); // 也支持
    表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
    表达式含义
    EQ 等于(=)
    NEQ 不等于(<>)
    GT 大于(>)
    EGT 大于等于(>=)
    LT 小于(<)
    ELT 小于等于(<=)
    LIKE 模糊查询
    [NOT] BETWEEN (不在)区间查询
    [NOT] IN (不在)IN 查询
    EXP 表达式查询,支持SQL语法
    多次调用
    where方法支持多次调用,但字符串条件只能出现一次,例如:
    $map['a'] = array('gt',1);
    $where['b'] = 1;
    $Model->where($map)->where($where)->where('status=1')->select();
    多次的数组条件表达式会最终合并,但字符串条件则只支持一次。

    ======================================================

    //实例化空模型
    $Model = new Model();
    //或者使用M快捷方法是等效的
    $Model = M();
    //进行原生的SQL查询
    $Model->query('SELECT * FROM think_user WHERE status = 1');

    $config = M('Config')->getField('name,value');

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。
    使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:
    $User->where('status=1')->order('create_time')->limit(10)->select();
    这里的where 、order 和limit 方法就被称之为连贯操作方法,除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作的方法调用顺序没有先后,
    例如,下面的代码和上面的等效:
    $User->order('create_time')->limit(10)->where('status=1')->select();
    如果不习惯使用连贯操作的话,还支持直接使用参数进行查询的方式。例如上面的代码可以改写为:
    $User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));
    使用数组参数方式的话,索引的名称就是连贯操作的方法名称。其实不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如:
    $User->where('id=1')->field('id,name,email')->find();
    $User->where('status=1 and id=1')->delete();
    连贯操作通常只有一个参数,并且仅在当此查询或者操作有效,完成后会自动清空连贯操作的所有传值(有个别特殊的连贯操作有多个参数,并且会记录当前的传值)。
    简而言之,连贯操作的结果不会带入以后的查询。

    ========================================================
    // 关闭字段缓存
    'DB_FIELDS_CACHE'=>false
    注意:调试模式下面由于考虑到数据结构可能会经常变动,所以默认是关闭字段缓存的。
    如果需要显式获取当前数据表的字段信息,可以使用模型类的getDbFields方法来获取当前数据对象的全部字段信息,例如:
    $User = M('User');
    $fields = $User->getDbFields();
    如果你在部署模式下面修改了数据表的字段信息,可能需要清空Data/_fields 目录下面的缓存文件,让系
    统重新获取更新的数据表字段信息,否则会发生新增的字段无法写入数据库的问题。
    如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,例如:
    namespace HomeModel;
    use ThinkModel;
    class UserModel extends Model {
    protected $fields = array('id', 'username', 'email', 'age');
    protected $pk = 'id';
    }
    pk 属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义。
    如果你的数据表使用了复合主键,可以这样定义:
    namespace HomeModel;
    use ThinkModel;
    class ScoreModel extends Model {
    protected $fields = array('user_id', 'lession_id','score');
    protected $pk = array('user_id','lession_id');
    }

    =======================================================
    Thinkphp关闭缓存方法
    /ThinkPHP/Conf目录下
    debug.php中
    'TMPL_CACHE_ON'=>false, // 默认开启模板缓存
    convention.php中
    'TMPL_CACHE_ON' => false, // 默认开启模板编译缓存 false 的话每次都重新编译模板
    'ACTION_CACHE_ON' => false, // 默认关闭Action 缓存
    'HTML_CACHE_ON' => false, // 默认关闭静态缓存
    'DB_FIELD_CACHE'=>false, //关闭全部缓存

    按照网上方法在debug.php、convention.php中配置还是不行,引人页面修改内容还是会缓存。

    必须在对应Application里面的Conf/config.php里面配置下面内容才能彻底关闭缓存
    return array(
    'TMPL_CACHE_ON' => false,
    'ACTION_CACHE_ON' => false,
    'HTML_CACHE_ON' => false,
    'DB_FIELD_CACHE' => false

    );
    =======================================================
    添加权限控制步骤(没有权限的提示系统异常跳转回去):
    1.在按钮处增加<if condition="checkRole('modifyGoods')">xxxxx</if>权限判断代码,没有权限不显示对应按钮。

    2.系统管理>>系统管理>>菜单管理 搜索对应菜单名称,新增菜单权限项目 :
    菜单权限名称:对应菜单名称
    菜单权限代码:对应checkRole 方法里面的代码,可以控制器名称一致
    关联模块名:
    关联控制器名:
    对应功能方法:
    后面三个分别为对应请求URL的路径名称 如:/Dependency/GoodsCombineManager/modify

    3.在后台系统管理>>系统管理>>角色管理 对应用户组勾选上新增的权限并保存。
    ========================================================
    删除有外键关联表的数据处理逻辑:
    public function doDelete()
    {
    $ids = I('post.ids', null);
    $arrIds = explode(',', $ids);
    $id_count = count($arrIds);
    for ($i=0; $i<$id_count; $i++)
    {
    $curId = $arrIds[$i];
    $result = M("goods")->where(array("goods_id"=>$curId))->find();//->select();多行记录
    //$mgs= M("goods")->getLastSql();
    $goods_status = $result["goods_status"];
    //1启用,2禁用
    if($goods_status == 1){
    $this->ajaxReturn(array(
    "status"=>1,
    "message"=>"组合商品为已生效状态不可删除"//.$mgs
    ));
    return;
    }
    }
    //选择的id全部都为禁用时才删除,先删除关联属性才能删除组合商品
    for ($i=0; $i<$id_count; $i++)
    {
    $curId = $arrIds[$i];
    //删除商品属性
    M("goods_properties_detail")->where(array("goods_id"=>$curId))->delete();
    //删除可销售商品,添加组合商品时,自动添加的可以删除
    M("goods_saler")->where(array("goods_id"=>$curId))->delete();
    }
    $this->_before_delete();
    // echo M("goods")->getLastSql();
    echo json_encode($this->deleteResult);
    }

    public function buildDeleteRestrictChecks()
    {
    return array(
    'model'=>'goods',
    'idField'=>'goods_id',
    'uniqueNameField' => 'goods_name',
    'uniqueNameText' => '商品名称',
    'relations'=>array(
    // array('model'=>'goods_properties_detail', 'relatedField'=>'goods_id', 'errMessage'=>'商品下有商品属性信息'),
    // array('model'=>'group_goods_detail','relatedField'=>'goods_id','errMessage'=>"这个组合商品下多个商品"),
    )
    );
    }
    =========================================================
    $querys["state"] = 1;
    $querys["rtype"] = $rtype;
    $solutions = M('recommend_solution')->where( $querys)->order('order_num')->field('design_solution_no')->select();
    $design_solution_nos = array();
    foreach ($solutions as $k=>$val){
    // array_push($design_solution_nos, $val['design_solution_no']);
    $design_solution_nos[] = $val['design_solution_no'];
    }
    $querys2["design_solution_no"] = array("in",$design_solution_nos);
    //design_solution_no,design_solution_title,design_solution_major_thumb,actual_inside_area,design_solution_tw4,design_solution_tw4_name,house_name,building_name
    $Parray =M("design_solution")->where($querys2)->select();

    ==========================================================
    怎样在thinkphp里面执行原生的sql语句
    $Model = new Model();//或者 $Model = D(); 或者 $Model = M();
    $sql = "select * from `order`";
    $voList = $Model->query($sql);
    只是需要new一个空的模型继承Model中的方法。
    注意query是查功能,execute是增删改功能
    -----------------------------------------------
    tP的模型可以支持原生SQL操作,提供了query和execute两个方法,为什么原生SQL还要区分两个方法呢,原因有两个:
    1、返回类型不同
    query用于查询,返回的是数据集,和select或者findall一样,所以可以直接在模板里面使用volist标签输出query的查询结果
    execute用于写操作,返回的是状态或者影响的记录数

    2、读写统计需要
    为了便于统计当前的数据读写次数,把数据库的读和写操作分开(对应的就是query和execute)
    使用原生SQL很简单,我们甚至不需要实例化任何的模型,例如:
    $Model = new Model(); // 实例化一个空模型
    下面的方法是等效的
    $Model = D(); 或者 $Model = M();
    // 下面执行原生SQL操作
    $Model->query('select * from think_user where status=1');
    $Model->execute('update think_user set status=1 where id=1');
    如果你实例化了某个模型,仍然可以执行原生SQL操作,不受影响,例如:
    $User = D('User');
    $User->query('select * from think_user where status=1');
    $User->execute('update think_user set status=1 where id=1');

    在这种情况下面,我们可以简化SQL语句的写法,例如:
    $User->query('select * from __TABLE__ where status=1');
    $User->execute('update __TABLE__ set status=1 where id=1');
    系统会自动把__TABLE__替换成当前模型对应的数据表名称,实际的数据表由模型决定。
    通常来说,我们都是使用原生SQL操作实现一些ORM和CURD比较难实现的操作,另外,如果SQL不复杂的话 原生SQL的效率和连贯操作的效率差别是微乎其微的,TP本身的ORM实现也是相当高效的。

    ==========================================================
    JOIN
    JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
    join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。
    INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
    LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    FULL JOIN: 只要其中一个表中存在匹配,就返回行
    join方法可以支持以上四种类型,例如:
    $Model = M('Artist');
    $Model
    ->join('think_work ON think_artist.id = think_work.artist_id')
    ->join('think_card ON think_artist.card_id = think_card.id')
    ->select();
    join方法支持多次调用,但指定的数据表必须是全称,但我们可以这样来定义:

    $Model
    ->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id')
    ->join('__CARD__ ON __ARTIST__.card_id = __CARD__.id')
    ->select();
    __WORK__ 和 __CARD__ 在最终解析的时候会转换为 think_work 和 think_card 。
    默认采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成
    $Model->join('RIGHT JOIN __WORK__ ON __ARTIST__.id = __WORK__.artist_id')->select();
    或者使用:
    $Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT')->select();
    join方法的第二个参数支持的类型包括:INNER LEFT RIGHT FULL。
    如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用。 例如:
    join(array(' __WORK__ ON __ARTIST__.id = __WORK__.artist_id','__CARD__ ON __ARTIST__.card_id = __C
    ARD__.id'))
    使用数组方式的情况下,第二个参数无效。因此必须在字符串中显式定义join类型,例如:
    join(array(' LEFT JOIN __WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT JOIN __CARD__ ON __
    ARTIST__.card_id = __CARD__.id'))

    ===================================================
    JavaScript parseInt() 函数
    parseInt("10");//返回 10
    parseInt("19",10); //返回 19 (10+9),后面的10表示10进制

    var ctype = {$ctype};
    改成
    var ctype = parseInt("{$ctype}");
    解决ThinkPHP模版传值{$ctype}这种写法在Dreamweaver报错的问题
    ===================================================
    thinkphp里try catch问题
    catch (Exception $e)会报错,php名字空间要求要改成 catch (Exception $e)

    =======================================
    ThinkPHP模板中使用U方法时无法嵌套大括号
    需要在control里面用U方法赋值给变量传到模版如:{:U('/Blog/comment/',array('id'=>$id)}
    $comment_url = U('/Blog/comment/',array('id'=>$id));
    $this->assign('comment_url', $comment_url);
    模版使用:
    <a href="{$comment_url}">xxx</a>


    ==========================================================

     更多内容以后添加

  • 相关阅读:
    js数组的迭代
    js检测对象的类型
    java基本数据类型及相互间的转换
    Mybatis Jdbctype JavaType 类型转换器
    Android TableLayout
    android:id设置的三种方式区别在哪?
    android:layout_gravity 和 android:gravity 的区别
    Android LinearLayout
    Log4j 分别使用不同的配置文件
    Extjs GridPanel 中放入 Combox显示问题
  • 原文地址:https://www.cnblogs.com/zdz8207/p/thinkphp-related.html
Copyright © 2020-2023  润新知