SQL 连贯操作 [2]
1、alias 用于设置数据表别名
$user = M('User');
var_dump($user->alias('anothername')->select());
这时在SQL中的查询语句为

需要注意的是如果将anothername 中的another 和name中加空格,这样是有问题的。就无法连接数据库了。
2、group 方法通常用于对结合函数统计的结果集分组。
$user = M('User');
var_dump($user->field('user,max(id)')->group('id')->select());
这时是按group里的id来分组,相同的id的则会在一起,如果是group('email'),则会根据email相同的分在一组,这时可能不是email所有的都会相同
但是按email第一个匹配的分在一块。这里的 field('user,max(id)') 是只取数据库里的user和id,其他的不显示
SQL语句为 SELECT `user`,max(id) FROM `think_user` GROUP BY id
3、having 方法一般用于配合 group 方法完成从分组的结果中再筛选数据。
$user = M('User');
var_dump($user->field('user,max(id)')->group('id')->having('id>2')->select());
从group分好组后,就开始筛选组里大于2的显示出来
SQL语句为 SELECT `user`,max(id) FROM `think_user` GROUP BY id HAVING id>2
4、distinct方法用于返回唯一不同的值
$user = M('User');
var_dump($user->distinct( true)->field('user')->select());
这时如果是相同的值就不会再显示出来
5、cache 用于查询缓存操作
$user = M('User');
var_dump($user->cache(true)->select());
PS:第一次查询数据库,第二次查询相同的内容直接调用缓存,不用再查询数据库。
三、命名范围
命名范围其实就是将 SQL 语句封装在模型定义类里,而不在控制器里。这样的分层操
作有利于代码的可读性,避免开发人员在写 CURD 操作时出现问题。架构人员只要在命名范
围内合理的规划即可,类似于架构师架构了接口,让开发人员面向接口开发一样。
要使用命名范围,第一步要定义属性:
在 Home/Model/UserModel.class.php 里插入以下代码:
<?php
namespace Home\Model;
use Think\Model; class UserModel extends Model {
protected $_scope = array( //$_scope是固定的,不可更改
'sql1' => array(
'where'=>array('id'=>1),
),
'sql2' =>array(
'order'=>array('date'=>'DESC'),
'limit'=> 2,
),
'default'=>array(
'where'=>array('id'=>2)
),
); }
然后在 Home/controller/UserController.class.php 中调用,需要注意的是,调用的时候scope也是不能改变的。
1.
$user = D('User');
var_dump($user->scope('sql1')->select());
这时得到的SQL查询语句为: SELECT * FROM `think_user` WHERE ( `id` = 1 )
2.
var_dump($user->scope('sql2')->select());
得到的SQL查询语句为: SELECT * FROM `think_user` ORDER BY `date` DESC LIMIT 2
3、
var_dump($user->scope('sql2')->scope('sql1')->select());
得到的SQL语句为:
SELECT * FROM `think_user` WHERE ( `id` = 1 ) ORDER BY `date` DESC LIMIT 2
4.
var_dump($user->scope()->select());
得到的SQL语句为: SELECT * FROM `think_user` WHERE ( `id` = 2 )
这时调用的default数组,也就是在调用scope()里面不需要填入参数
5.
var_dump($user->scope('sql2',array('limit'=>4))->select());
在调用时改变原来sql2的数组的条件,也可以改变全部的
6.
var_dump($user->scope(array('where'=>array('id'=>1),'order'=>'date desc','limit'=>4))->select());
这时是直接写入参数,不调用类里面的参数
7.
var_dump($user->sql1()->select());
这里是把写在类里的数组直接当作方法来调用,效果和调用sql1是一样的。
SQL 连贯操作 [2]的更多相关文章
- SQL 连贯操作 [1]
一. 连贯入门 查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两位. 在 Home/controller/UserController.class.php 下插入 1.连贯操作入门 $us ...
- 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句
如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...
- ci连贯操作的limit两个参数和sql是相反的
ci连贯操作的limit两个参数和sql是相反的 db->where("name =",'mary')->ge() name后面要有个空格否则报错当为一个字段 -> ...
- ThinkPhp 3.2 数据的连贯操作
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...
- thinkPHP--SQL连贯操作
一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位. //连贯操作入门 $user = M('User'); var_dump($user-& ...
- 【转】PHP实现连贯操作
[第一种方案 __call] 我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码. M('User')->where(array('id'=>1))->field( ...
- Laravel框架数据库CURD操作、连贯操作
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 $users = DB::t ...
- Laravel框架数据库CURD操作、连贯操作总结
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 复制代码代码如下: $use ...
- ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)
1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...
随机推荐
- Adobe Reader 的直接下载地址
页面:https://get.adobe.com/reader/direct/ 选择操作系统.选择语言.选择版本,然后点击立即下载. https://ardownload2.adobe.com/pub ...
- Git_学习_09_指定某些文件不上传
一.前言 在git提交文件到远程分支时,可能有些文件我们并不想上传. 这时可以使用如下命令来将这些文件从暂存区移除 git rm --cached "文件路径" 注:git add ...
- [基本操作] kd 树
概念就不说了吧,网上教程满天飞 学了半天才知道,kd 树实质上只干了两件事情: 1.快速定位一个点 / 矩形 2.有理有据地优化暴力 第一点大概是可以来做二维平面上给点/矩形打标记的问题 第二点大概是 ...
- LeetCode Perfect Number
原题链接在这里:https://leetcode.com/problems/perfect-number/#/description 题目: We define the Perfect Number ...
- bzoj 4059:Non-boring sequences 分治
题目: 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请 ...
- java shell排序
原理图: package suanfa; public class shellInsert { public void shellInsert1(double [] sorted,int inc){ ...
- vue.js初学(一) vue的入门编程
1:首先引入vue.js 2:点击事件 <div id='clickVue'> <p>{{message}}</p> <button v-on:click=& ...
- webrtc自带client的视频引擎创建代码走读
src\webrtc\examples\peerconnection\client\conductor.ccbool Conductor::InitializePeerConnection()1 we ...
- Surface Pro 4远程桌面分辨率问题
Surface Pro 4是非常收欢迎的笔记本电脑.但我们这些技术人员在使用中有一点非常不方便: Surface Pro 4的分辨率非常高,如果用Surface Pro 4远程桌面到远端的一台机器,因 ...
- JQ选择器大全
jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...