zoukankan      html  css  js  c++  java
  • 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 HomeModel;
    use ThinkModel;
    
    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是一样的。

  • 相关阅读:
    VirtualBox如何增加CentOS根目录容量
    关于yum的一些安装问题
    Linux分区方案
    排查java.lang.OutOfMemoryError: GC overhead limit exceeded
    Linux Shell 编程 教程 常用命令
    sqlalchemy(二)简单的连接示例
    sqlalchemy(一)常用连接参数及包
    Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置,更新docker
    删除所有已经停止的容器 docker rm $(docker ps -a -q)
    离线安装docker镜像
  • 原文地址:https://www.cnblogs.com/jacson/p/4490636.html
Copyright © 2011-2022 走看看