图片 5

自定义基类,数据库操作之数据表模型和底蕴模型

By admin in 编程 on 2019年4月29日

   ThinkPHP 提供了一个 Model 类,供其他的 Model 进行继承。Model 类中是
MVC 中的模型类,它是调用 持久层
的上层类。感觉这么描述问题很多,但是有什么办法呢?但是,这个 Model
有时无法满足我们的一些需求,因此我们需要自定义一个 Model
类出来,不过自定义的 Model 同样要继承 TP 提供的 Model
类,而把我们自定义的 Model 类作为我们项目中的 Model
基类。我怎么感觉我在说绕口令,等等…我有点晕。

//TP 恶补ing... 

最近比较绕有兴趣地学习PHP,看完了一些基础语法、学会了使用SMARY模版,继而看了ThinkPHP框架,

 

一、定义数据表模型

此框架的强大超出我的意外,它的ROR真是强,还有内置的CRUD,比JAVA的框架更智能。

无聊的需求

1.模型映射

方便记忆性的学习转载了一些以下文章

  在使用 Java 的开源项目 JeeSite
时,养成了一个不好的习惯,习惯给每张表都增加
create_by、create_date、update_by、update_date、remarks 和 del_flag
这么几个字段。如果每张表都有这几个字段,那么对每张表进行 insert
时都会对以上的字段进行设置,对每张表进行 update
时都会对其中部分字段进行更新,对每条记录进行 delete 时都其实是对
del_flag 字段进行
置位。重复操作很多,一些操作方法被修改。那么,这个时候就要自定义一个自己的
Model 来作为项目的 基类 了,这个 Model 就负责干上面我说的那些事情了。

要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用
dump 函数输出,查看数据库的链接状态。代码:

CURD知识之一 C 创建(create)

 

public function testdb(){        $obj=M("User");      dump($obj);  }

名词解析:
1  CURD:代表数据库四个基本操作:创建:create,更新:update,读取:read,删除:delete

自定义一个 Model

此时浏览器输出:

2  模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。例如Model类的tableName属性

  自定义一个 Model,Model 中至少重新 TP 提供的 Model 中的
add、save、delete 和 select 方法。

图片 1图片 2

在第三节时,曾略为提到Model类文件命名,现在再回顾一下这部分的内容:
我们之前在数据库中,已建立了一个think_form数据库表,并且在配置文件config.php中,我们定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:

  定义代码如下:

object(Model)#5 (20) {    ["_extModel:private"] => NULL    ["db:protected"] => object(DbMysql)#7 (18) {      ["dbType:protected"] => string(5) "MYSQL"      ["autoFree:protected"] => bool(false)      ["model:protected"] => string(7) "_think_"      ["pconnect:protected"] => bool(false)      ["queryStr:protected"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      ["modelSql:protected"] => array(1) {        ["user"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      }      ["lastInsID:protected"] => NULL      ["numRows:protected"] => int(2)      ["numCols:protected"] => int(0)      ["transTimes:protected"] => int(0)      ["error:protected"] => string(0) ""      ["linkID:protected"] => array(1) {        [0] => resource(27) of type (mysql link)      }      ["_linkID:protected"] => resource(27) of type (mysql link)      ["queryID:protected"] => resource(28) of type (mysql result)      ["connected:protected"] => bool(true)      ["comparison:protected"] => array(10) {        ["eq"] => string(1) "="        ["neq"] => string(2) "<>"        ["gt"] => string(1) ">"        ["egt"] => string(2) ">="        ["lt"] => string(1) "<"        ["elt"] => string(2) "<="        ["notlike"] => string(8) "NOT LIKE"        ["like"] => string(4) "LIKE"        ["in"] => string(2) "IN"        ["notin"] => string(6) "NOT IN"      }      ["selectSql:protected"] => string(96) "SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%"      ["bind:protected"] => array(0) {      }    }    ["pk:protected"] => string(2) "id"    ["tablePrefix:protected"] => string(4) "tpk_"    ["name:protected"] => string(4) "user"    ["dbName:protected"] => string(0) ""    ["connection:protected"] => string(0) ""    ["tableName:protected"] => string(0) ""    ["trueTableName:protected"] => string(8) "tpk_user"    ["error:protected"] => string(0) ""    ["fields:protected"] => array(5) {      [0] => string(2) "id"      [1] => string(8) "username"      ["_autoinc"] => bool(true)      ["_pk"] => string(2) "id"      ["_type"] => array(2) {        ["id"] => string(7) "int(11)"        ["username"] => string(11) "varchar(20)"      }    }    ["data:protected"] => array(0) {    }    ["options:protected"] => array(0) {    }    ["_validate:protected"] => array(0) {    }    ["_auto:protected"] => array(0) {    }    ["_map:protected"] => array(0) {    }    ["_scope:protected"] => array(0) {    }    ["autoCheckFields:protected"] => bool(true)    ["patchValidate:protected"] => bool(false)    ["methods:protected"] => array(13) {      [0] => string(5) "table"      [1] => string(5) "order"      [2] => string(5) "alias"      [3] => string(6) "having"      [4] => string(5) "group"      [5] => string(4) "lock"      [6] => string(8) "distinct"      [7] => string(4) "auto"      [8] => string(6) "filter"      [9] => string(8) "validate"      [10] => string(6) "result"      [11] => string(4) "bind"      [12] => string(5) "token"    }  }

不包括前缀的数据库表表名并且首字母大写+Model.class.php

 1 <?php
 2 namespace Admin\Model;
 3 use Think\Model;
 4 
 5 /**
 6  * 项目中其他 Model 类的基类
 7  * 该类继承自 TP 提供的基类 Model
 8  */
 9 class BaseModel extends Model {
10     
11     /**
12      * 继承基类 Model 的 add 方法
13      * 自动插入 id create_by create_date update_by update_date del_flag
14      */
15     public function add($data='',$options=array(),$replace=false) {
16         
17         $data["id"]          = $this->getUuid();
18         $data["create_by"]   = "";
19         $data["create_date"] = date("Y-m-d H:i:s");
20         $data["update_by"]   = "";
21         $data["update_date"] = date("Y-m-d H:i:s");
22         $data["del_flag"]    = '0';
23         
24         return parent::add($data, $options, $replace);
25     }
26     
27     /**
28      * 获得 未删除 的所有数据
29      * 记录是否被删除通过 del_flag 字段来进行确定
30      */
31     public function select($options=array()) {
32         $map["del_flag"] = 0;
33         $this->where($map);
34         
35         return parent::select($options);
36     }
37     
38     /**
39      * 获取 全部 的所有数据
40      */
41     public function selectAll($options=array()) {
42         return parent::select($options);
43     }
44     
45     /**
46      * 更新数据
47      * 更新数据时,要更新 update_by update_date 两个字段
48      */
49     public function save($data='',$options=array()) {
50         $data["update_by"]   = "";
51         $data["update_date"] = date("Y-m-d H:i:s");
52         
53         return parent::save($data, $options);
54     }
55     
56     /**
57      * 删除也是更新
58      * 设置 删除 标志位即可
59      */
60     public function delete($data='',$options=array()) {
61         $data["del_flag"] = 1;
62         
63         return parent::save($data, $options);
64     }

所以之前我们为think_form数据表在Myapp/Lib/Model目录下建立一个文件FormModel.class.php

  这样,我们的 BaseModel 就定义好了,以后项目中的 Model 就不再继承 TP
的 Model 类了,而是继承我们自定义的 BaseModel 了。

如果没有提示错误即为成功。

模型类的特殊命名还可以智能识别驼峰式的表命名,假设我们有个是类似think_new_table这样的表
可以命名为NewTableModel.class.php。默认配置便可以智能识别自动对应think_new_table表,因此不必修改配置。

 

M(“User”) 就是模型映射,M 函数等于 new Model() ,Model
类是模型的基类,也是数据库操作的基类, “User”
是该类的一个成员属性,表示模型名称,模型名称与数据库中的数据表进行映射。注意:User
“U” 要大写,数据库中此时应该存在一张 user
表,系统会根据配置文件中的设置给 user 表添加前缀,例如
tpk_user。如果不需要为表添加前缀,将模型名称首字母改为小写,例如
M(“user”)。

开发过程中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),就可以进行对数据操作了。
如何让这个模型支持自动验证,自动填充,自动过滤这些知识,在下面涉及到时会作相应讲解。

继承我们定义的基类

 

一般来说,在表中添加数据都是通过表单来建立,为了更直观地学习CURD中的C,我们接下来建立个表单来进行添加数据的操作。
之前我们已在Myapp/Lib/Model/下建立好FormModel.class.php类—-模型(M)
同时也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个index操作—-控制器(C)
并且在Tpl目录下建立了与之对应的模板目录Index及index.html模板文件 ——-视图(V)
MVC模式的开发已体现了出来。
tdweb曾简明扼要地概括了TP中这三者的关系,

  继承的 BaseModel 的方法和继承 Model 的方法是一样的,只是使用 use
引入命名空间到当前作用域时的需要修改为我们的命名空间,而不是再去使用 TP
提供的命名空间。代码如下:

2.自定义模型

C的作用,就是从M中取得数据到V,

1 <?php
2 namespace Admin\Model;
3 use Admin\Model\BaseModel;
4 
5 class TrunkModel extends BaseModel {

D
函数用于快速实例化自定义模型,可以进行复杂的数据库操作,比如数据检验、数据缓存、数据加工等。自定义模型存放在
Lib/Model 目录下,例如为数据表 tpk_article
数据表建立模型映射,则需要创建 ArticleModel.class.php,然后使用 D
函数进行实例化,ArticleModel 模型将与 tpk_article 表进行映射。

使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。
我们在实际操作中体会一下。
先来看看我们所定义的数据表form的字段:

  use 引入的命名空间是 Admin\Model\BaseModel ,因为我们定义的
BaseModel 的命名空间是 Admin\Model,因为这里的 TrunkModel 和 BaseModel
在一个命名空间下,省去 use 也是可以的。

例:使用 select() 输出 tpk_article 表的数据 ( select()
方法用于列出所有符合条件的数据 ) :

  1. ‘id’,//自动编号
  2. ‘title’,//标题
  3. ‘content’,//内容
  4. ‘create_time’,//创建时间
  5. ‘update_time’//更新时间
  6. ’email’,//邮箱
  7. ‘status’,//状态

 

class IndexAction extends Action {          public function article(){        $obj=D("Article");      $rows=$obj->select();                  dump($rows);     }  }

复制代码

  这样,在我们用 D 方法实例化 TrunkModel 的对象后,使用 add
方法插入数据时,就会先调用 BaseModel 中的 add
方法了,这样我们每张表都有的 create_by 等一系列字段就都会自动得到了。

浏览器输出:

其中的create_time字段是为了记录数据插入的时间,我们可以利用TP的数据自动填充来处理。

图片 3图片 4

在Model类定义 $_auto
属性,可以完成数据自动处理功能,用来处理默认值和其他 onclick=”tagshow(event)”>系统写入字段。
注意1:该自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。
注意2:要使用Model类的create方法创建数据对象的时候才会自动进行表单数据处理。

array(6) {    [0] => array(7) {      ["id"] => string(1) "1"      ["title"] => string(4) "test"      ["content"] => string(12) "test_content"      ["category"] => string(13) "test_category"      ["area"] => string(6) "北京"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-20 23:03:44"    }    [1] => array(7) {      ["id"] => string(1) "2"      ["title"] => string(12) "吼吼吼吼"      ["content"] => string(18) "任溶溶柔然人"      ["category"] => string(14) "test_category2"      ["area"] => string(6) "河北"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-22 15:16:12"    }    [2] => array(7) {      ["id"] => string(1) "4"      ["title"] => string(7) "test2_m"      ["content"] => string(4) "haha"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 11:44:26"    }    [3] => array(7) {      ["id"] => string(1) "5"      ["title"] => string(2) "22"      ["content"] => NULL      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 12:40:58"    }    [4] => array(7) {      ["id"] => string(1) "6"      ["title"] => string(1) "1"      ["content"] => string(1) "2"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => NULL    }    [5] => array(7) {      ["id"] => string(1) "7"      ["title"] => string(6) "lalala"      ["content"] => string(6) "hohoho"      ["category"] => string(0) ""      ["area"] => string(6) "北京"      ["add_user"] => NULL      ["add_time"] => NULL    }  }

1 打开Myapp/Lib/Model/FormModel.class.php文件,更改代码为

  1. <?php
  2. class FormModel extends Model {
  3. // 自动填充设置
  4. protected $_auto  =  array(
  5.   array(‘status’,’1′,’ADD’),
  6.         array(‘create_time’,’time’,’ADD’,’function’),
  7. );
  8. }
  9. ?>

 

代码知识要点:
Model类的$_auto属性由多个填充因子组成的数组,填充因子定义格式:

例2:让 tpk_article 表的内容根据客户所在的地区显示当地的新闻:

array(填充字段,填充内容,填充条件,附加规则)

ArticleModel.class.php:

填充字段:就是需要进行处理的表单字段,这个字段并不一定要是数据库表中的字段,对于表单内的辅助检测字段比如重复密码和验证码也可以处理。
填充条件:ADD | UPDATE | ALL(注意,此是1.5版本说明,1.6已改为1 2
3,后续教程有说明)
当为ADD时,会在新增数据时自动填充,这是默认的处理方式
当为UPDATE时,在更新数据的时候会自动填充
当为ALL时,所有情况下都会进行自动填充

<?php  class ArticleModel extends Model{            public function article(){                $rows=$this->where("area='{$this->checkUserArea()}'")->select();          return $rows;      }        protected function checkUserArea(){                return "北京";          }

附加规则:附加规则是针对填充内容而言,表示该内容填充的方式,包括function,callback,field,string
对于field使用其它字段进行填充和string直接标示字符串作为值进行填充很好理解。例如上面

控制器代码:

  1. array(‘status’,’1′,’ADD’),

IndexAction.class.php:

复制代码

<?php  class IndexAction extends Action {        $obj=D("Article");      $rows=$obj->article();      $this->assign("list",$rows);      $this->display();

就是将状态status字段的值直接以1填充.

同时视图代码:

下面主要说说function与callback这两个附加规则。

TPL/Index/article.html:

  1. protected $_auto  =  array(
  2. array(‘create_time’,’time’,’ADD’,’function’),
  3. );
<!DOCTYPE html>  <html>  <body>    <volist name="list" id="vo">      <li><{$vo.title}> - <{$vo.area}> - <{$vo.content}></li>  </volist>    </body>  </html>

上面create_time代表了要处理的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在新增的时候使time函数作为该字段的值进行自动填充。
再看一个function作为附加规则的例子

附:数据表 tpk_article 的表结构为:

  1. protected $_auto  =  array(
  2. array(‘password’,’md5′,’ADD’,’function’),
  3. );

图片 5

当使用function作为附加规则时,第二个填充内容就代表了这个因子是一个函数名称,该函数的参数就是代表填充字段的值,比如password的值是123456,则上面的代码会先将这个值使用函数md5(‘123456’),这样处理后再插入到数据表中去。
对于function(函数)和callback(回调方法)理论是一样的,只不过一个是表示填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而callback是当前模型类所能调用的一个方法。 有关数据填充方面的详细资料,请参看官方使用手册
《ThinkPHP数据操作指南》

总结:自定义模型映射,一个模型对应一个数据表,所有增删改查都在模型类中完成。M
实例化的参数是数据库的表名,D 实例化的是自己在 model
文件夹下建立的模型文件。

2 打开Myapp/Tpl/default/Index/index.html文件,我们修改代码将form写进去

 

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0
    Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$title}</title>
  5. </head>
  6. <body>
  7. <form action=”__URL__/add” method=”post” name=”formname”
    id=”formname”>
  8.     <p>
  9.            <label for=”title”>标题:</label>
  10.            <input name=”title” type=”text” id=”title” />
  11.     </p>
  12.     <p>
  13.            <label for=”email”>邮箱:</label>
  14.           <input name=”email” type=”text” id=”email” />
  15.     </p>
  16.     <p><label
    for=”content”>内容:</label></p>
  17.     <p>
  18.         <textarea name=”content” rows=”5″ cols=”25″
    id=”content” ></textarea>
  19.     </p>
  20.     <p><input type=”submit” value=”提交” /></p>
  21. </form>
    </body>
    </html>

3.create 方法

在上面代码中,我们简单地建了一个form表单,并将标题统一使用一个模板变量{$title}。
action提交到的处理地址是__URL__/add,其中__URL__是一个常量定义,表示当前模块地址,TP模板引擎会自动将这句解释为/index.php/Index/add,常见的模板使用的常量有

TP 对数据的插入和更新都做了高度封装:提供了 create()
方法用于创建数据对象。

__ROOT__    网站根目录地址
__APP__         当前项目(入口文件)地址
__URL__         当前模块地址
__ACTION__   当前操作地址
__SELF__       当前 URL 地址

概念:数据对象 ——
数据字段与数据表之间的关系,数据会被映射为类成员,再与数据表映射,最后实现数据的插入或更新。

3 设置模板变量 {$title} ,增加add操作方法

create() 方法是连贯操作、CURD 操作的集合 (
包括数据创建、数据检验、表单验证、自动完成等 )。

打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码如下

cerate() 的数据源由 POST 表单提供,比如表单中有 username
表单元素,则该元素会被自动映射为数据表中的 username
字段。数据对象创建成功以后,对象被存放于内存中。

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index() {
  4.        
       $this->assign(‘title’,’添加数据’);//这里设置了模板变量{$title}
  5.            $this->display();
  6.     }
  7.     // 处理表单数据的方法
  8.     function add()  {
  9.           $Form = D(“Form”);
  10.           if($Form->create()) {
  11.                    $Form->add();
  12.                    $this->redirect();
  13.           }else{
  14.                    header(“Content-Type:text/html;
    charset=utf-8”);
  15.                    exit($Form->getError().’ [ <A >返
    回</A> ]’);
  16.          }
  17.     }
  18. }//类定义 end
  19. ?>

例:添加数据

代码知识要点:
模板变量赋值前面的章节已介绍过。这里就不啰嗦了。

控制器:IndexAction,动作:add_article,代码:

我们来看看add方法的代码。
$Form = D(“Form”);
这里使用了TP的特色单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的具体代码可以查看ThinkPHP目录内的common/function.php中的片段,
它会自动引入Model类,并判断之前如果实例化过这个Model,就不再实例化,若然该Model不存在,就会抛出异常错误,另外,D可以跨项目访问Model,暂且忽略。

IndexAction.class.php:

$Form->create()
使用Model类的Create方法创建一个Form对象,失败会返回false。

<?php  class IndexAction extends Action {        Public function add_article(){            $this->display();      }  }

$Form->add(); //add方法会将表单数据进行写入
$this->redirect(); //执行跳转
就这么简单几行代码,便完成了对数据插入的处理。

视图: Tpl/Index/add_article.html:


<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="title" placeholder="标题"><br><br>          <textarea name="content" id="content" placeholder="内容"></textarea><br><br>          <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

__URL__/add 表示当前控制器的 add 动作。

add 动作代码:

<?php  class IndexAction extends Action {        public function add(){            //表单处理          $articleObj = M('Article');          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }  }

例子结束。

 

4.模型属性( Model )

 _map 属性:字段映射

为了避免前台表单元素与数据库字段名相同而使数据库字段暴露,可以修改前台表单元素的
name,同时在 Model 中使用 _map 属性。代码:

视图:Tpl/Index/add_article.html:

<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="subject" placeholder="标题"><br><br>          <textarea name="textEdit" id="content" placeholder="内容"></textarea><br><br>           <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

模型:ArticleModel.class.php:

<?php  class ArticleModel extends Model{        //使用_map属性(字段映射)将表单元素映射为相应表字段      protected $_map = array(                    "subject"=>"title",          "textEdit"=>"content"      );    }

控制器:IndexAction.class.php:

<?php    class IndexAction extends Action {            $articleObj = D("Article");          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                        $this->success("数据添加成功");          }else{                        $this->error("数据添加失败");          }  }

例子结束。

 

二、基础模型

1.连贯操作

连贯方法除了 select() 方法外,其他的连贯方法不区分前后顺序。

例:

$rows=$obj->where("add_user='dee'")->order("add_time desc")->limit(10)->select();

 

2.CURD

① 创建数据 add()

<?php    class IndexAction extends Action {            public function post(){            $articleObj = D("Article");          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->add($data)){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

另一个例子:

<?php    class IndexAction extends Action {            public function post(){            $articleObj = D("Article");          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['add_time'] = date("Y-m-d H:i:s",time());            if($articleObj->data($data)->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

 

② 更新数据 save()

<?php    class IndexAction extends Action {      public function post2(){            $articleObj = M("Article");          $data['id'] = 2;          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['area'] = '河北';          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->save($data)){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

 

 

③ 读取数据 select 和 getFiled

getField 例子:

<?php    class IndexAction extends Action {        public function post3(){            $articleObj = M("Article");          if($articleObj->where("id=3")->setField("content","{$_POST['subject']}")){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

 

④ 删除数据 delete

<?php    class IndexAction extends Action {            public function delete(){            $articleObj = M("Article");          if($articleObj->where("id=".$_GET['id'])->delete()){                $this->success("数据删除成功");          }else{                $this->error("数据删除失败");          }      }  }

 

3.查询语言

例子:

<?php    class IndexAction extends Action {        public function archives(){            $obj = M("Archives");  //      $data['writer'] = array("eq","网络营销中心");  //      $data['title'] = array("like","精诚%");          $data['id'] = array("lt","100");          $rows=$obj->where($data)->select();            $count=$obj->where($data)->count();          $tb=C("DB_PREFIX");            $this->assign("list",$rows);          $this->assign("count",$count);          $this->assign("tb",$tb);          $this->display("Article");      }            public function archives2(){            $obj = M("Archives");          $data['id'] = array(array("lt","1034"),array("GT","1029"),"and");          $rows=$obj->where($data)->select();          $this->assign("list",$rows);          $this->display("Article");      }  }

 

可以在控制器中使用 echo $obj->getLastSql(); 查看转换后的 SQL 语句。

 

参考资料:《PHP MVC 开发实战》

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2020 澳门新葡亰官网app 版权所有