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);
=======================================================
\ThinkPHP\Conf\convention.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 Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age');
protected $pk = 'id';
}
pk 属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义。
如果你的数据表使用了复合主键,可以这样定义:
namespace Home\Model;
use Think\Model;
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>
==========================================================
更多内容以后添加