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);
=======================================================
\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>
==========================================================
更多内容以后添加
thinkphp相关的更多相关文章
- thinkphp相关功能整合系列
thinkphp整合系列之短信验证码.订单通知 thinkphp整合系列之rbac的升级版auth权限管理系统demo thinkphp整合系列之阿里云oss thinkphp整合系列之phpmail ...
- thinkphp相关总结
1.model层验证多个字段唯一性 protected $_validate = array( array('appid,awardid', '', '不能重复添加', self::MUST_VALI ...
- thinkphp 相关
路径重写,既模式2 需要.htaccess文件放到index.php同级, http.config文件 中当前项目目录配置 AllowOverride All LoadModule rewrite_ ...
- thinkPHP内置字符串截取msubstr函数用法详解
作者:陈达辉 字体:[增加 减小] 类型:转载 时间:2016-11-15 我要评论 这篇文章主要介绍了thinkPHP内置字符串截取函数用法,结合实例形式分析了thinkPHP内置的字符串截取函数功 ...
- form 表单跨域提交
<!DOCTYPE html><html> <head> <title>form 表单上传文件</title> <script src ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- thinkphp框架相关研究(一)
小编最近开始正式研究thinkphp框架,在此写下研究的整个历程,从最最基本的搭建网站开始,一步步记录.希望对大家有所帮助. 1.菜鸟从下载框架到建站 参考网址:http://blog.csdn.ne ...
- thinkphp框架的相关总结
参考链接地址:http://gongwen.sinaapp.com/article-205.html 1. 模板中不能使用的标签 {$content} {$i} 2. If标签 如: <if c ...
- ThinkPHP 自动验证相关注意
1.假如加入了表单令牌的话,表单的各种名与对应Model字段一致,不然报坑爹的令牌错误. 2.假如加入了表单令牌的话,Create只能采用默认的POST数据创建数据对象,不然又是坑爹的令牌错误. 3. ...
随机推荐
- 爬虫之Scrapy详解
性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...
- centos 安装laravel
1.下载composer并全局安装 curl -sS https://getcomposer.org/installer | php 2.查看全局命令目录 echo $PATH 移动composer到 ...
- css中:hover空格
前面有空格后代所有节点,前面无空格第一个节点 <div class="task-item"> <span><input type="chec ...
- zero-shot learning(ps:每天演好一个情绪稳定的成年人)
my paper~~ 1.(DAP,IAP)Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer 2 ...
- libmv
What is libmv? libmv, also known as the Library for Multiview Reconstruction (or LMV), is the comput ...
- IDEA2016.3搭建Struts2+Hibernate+Spring项目环境
IDEA搭建SSH环境 1.环境 软件版本:IntelliJ IDEA 2016.3.2 系统:windows 7 32位 / ubuntu 框架:Hibernate3,Spring3.2, Stru ...
- 反面教材 构造构造 json 数据
构造构造 json 数据 说说你们在项目中遇到过的最糟糕的代码 - V2EX https://www.v2ex.com/t/214099
- 【RBAC】打造Web权限控制系统
引言 权限系统模块对于互联网产品是一个非常重要的功能,可以控制不同的角色合理的访问不同的资源从而达到安全访问的作用 此外本次课程有视频讲解: http://www.imooc.com/learn/79 ...
- 洛谷P3826 蔬菜 [NOI2017] 贪心
正解:贪心 解题报告: umm,,,其实我还不会 废话我这么菜怎么可能懂QAQ 先占坑,想学习这题很久了呢QAQ
- inux man命令的使用方法(转)
原文:http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html Linux的man手册共有以下几个章节: 代號 代表內容 1 使用 ...