【4858.com】散乱笔记,实例化模型的多种方法

By admin in 4858.com on 2019年2月11日

运用 D()方法比一直动用模型类特别的智能,若是在HomeModelUserModel
找不到该模型类, 那么就会去公共模块下找CommonModelUserModel 去找。
纵然还找不到,就会直接实例化基类 Model()类,约等于等同于使用 M()方法。

动用 D()方法比平昔运用模型类越发的智能,即便在HomeModelUserModel
找不到该模型类, 那么就会去公共模块下找CommonModelUserModel 去找。
借使还找不到,就会一向实例化基类 Model()类,约等于等同于使用 M()方法。

配备形式可用八个单入口表示前后台
thinkphp
Uploads
public

创建Action类

急需注意的是:D(‘User’)方法中的表名要求首字母大写,因为查找跳到公共模块里时手足无措分辨小写的user,除非你显式的写成:D(‘Common/user’),那样完整的写法用小写user也行,否则若您直接用
D(‘user’)
的话,它会跳过公共模块直接去实例化基类Model()。因而指出养成表的首字母大字的习惯,以免出错。

急需专注的是:D(‘User’)方法中的表名须要首字母大写,因为查找跳到公共模块里时不大概辨认小写的user,除非您显式的写成:D(‘Common/user’),那样完整的写法用小写user也行,否则若你一直用
D(‘user’)
的话,它会跳过公共模块直接去实例化基类Model()。由此提出养成表的首字母大字的习惯,避防出错。

Home(前台)
Admin(后台)
index.php(前台入口文件)
admin.php(后台进口文件)
地方三个类型目录

 

 

 

也得以用分组开式,此时简化了一个品种目录
Thinkphp
App(Home/Admin)
public
Uploads
index.php(入口文件)

[php]  

本来,上述难点重借使出于用小写的user时:

本来,上述难点关键是由于用小写的user时:

那时的布局目录为
app/Config/Home/config.php
app/Config/Admin/config.php
还得开启用分组配置文件:
‘APP_GROUP_LSIT’ => ‘Home,Admin’,//项目分组设定
‘DEFAULT_GROUP’ => ‘Home’, //暗许分组

<?php  

D(’user’)方法在 Home
模块里可以辨认,直接实例化也没难点,唯有跨模块(比如Common)仿问时才会时有暴发。当然,M(’user’)方法用小写也足以识别。

D(’user’)方法在 Home
模块里可以辨认,直接实例化也没难点,只有跨模块(比如Common)仿问时才会发生。当然,M(’user’)方法用小写也可以识别。

Import(‘@.Action.UserInfo’) // APP_NAME/lib/Action/UserInfo.class.php
Import(‘@.Model.User’); // APP_NAME/lib/Model/User.class.php
Import(APP_NAME’.Model.UserModel’); //
APP_NAME/lib/model/UserModel.class.php

class NewObjectAction extends Action{  

 

 

Import(‘Think.Core.test’); // Thinkphp/lib/Core/test.class.php
Import(‘ORG.Util.Array’); //
Thinkphp/Extend/Library/ORG/Util/Array.class.php
Import(‘COM.Util.Arr’); //
Thinkphp/Extend/Library/COM/Util/Arr.class.php
Import(‘ORG.Util.Pp#ok’); //
Thinkphp/Extend/Library/ORG/Util/Pp.ok.class.php

    public function index(){  

其余,即便使用索引数组作为查询条件也要留意:

别的,假诺选择索引数组作为查询条件也要专注:

别名导入
在ThinkPHP/Conf/alias.php中定义 如:
return array(
    ‘rbac’ => LIB_PATH . ‘Common/Rabc.class.php’,
    ‘page’ => LIB_PATH. ‘Common/Page.class.php’
);
则:
import(‘rabc’); // LIB_PATH . ‘Common/Rabc.class.php’,
import(‘page’); // LIB_PATH. ‘Common/Page.class.php’

        //1.创立一个基础模型  

D(‘User’)方法查找到的模型假使有手工定义数据字段的话,那么查询将不恐怕生效。意思是那样滴:

D(‘User’)方法查找到的模型即便有手工定义数据字段的话,那么查询将无法生效。意思是这么滴:

手动载入/其中$baseUrl没有起效率
load($name, $baseUrl=”, $ext=’.php’)方法
load(‘@.user’);// APP_NAME/Common/user.php
@.user表示加载当前项目标user函数文件,那样就足以直接user.php扩大函数库中的函数了

//      //一:实例化一个系统的数据库操作类  

namespace HomeModel;

namespace HomeModel;

load(‘user’);
代表导入 ThinkPHP/Extend/Function/user.php

//      //new
Model(‘User’)约等于M(‘User’),在Model中放置一个亟需操作的表  

use ThinkModel;

use ThinkModel;

导入第三方类库
其三方类库统一放置在系统增加目录下的Vendor 目录,并且应用vendor
方法导入
Vendor(‘Zend.Filter.Dir’); //
ThinkPHP/Extend/Vendor/Zend/Filter/Dir.php
Vendor(‘Zend.Filter.Dir’, dirname(), ‘.class.php’); //
ThinkPHP/Extend/Vendor/Zend/Filter/Dir.class.php

//      //1命名:  

class UserModel extends Model{

class UserModel extends Model{

URL_PATHINFO_DEPR == ‘/’, ‘,’

//      //
 thinkphp默许的有表名前缀,倘诺为think_user;则在Model中可以采纳User或许user来获取
 

protected $fields=array(  //
这是手工定义字段

protected $fields=array(  //
那是手工定义字段

概念了序列和分组
ITEM = ‘app’
GROUP_LIST = ‘admin, home’

//      //
 如果是think_user_message;则利用Model(‘UserMessage’);大写表示对此的表名前边加上一个_
 

  ’id’,

  ’id’,

config.php
‘APP_GROUP_LIST’ => ‘Home,Admin’, //项目分组设定
‘DEFAULT_GROUP’  => ‘Home’, //暗中认同分组

//      $User=new Model(‘User’);  

  ’user’,

  ’user’,

//      //调用查询格局  

  ’_pk’=>’id’,

  ’_pk’=>’id’,

增添了操作方法添加后缀成效,如
config.php
‘ACTION_SUFFIX’ => ‘Act’
localhost/index.php/m/a/变成了拜访里面的 aAct方法了

//      $list=$User->select();  

  ’type’=>array(

  ’type’=>array(

模块定义:UserAction.class.php
class UserAction extends Action
{
  public function add()
  {
    this->display();//没有赋值,则暗中同意加载模板 Tpl/User/add.html
    this->display(‘Test/add’); // 则加载 Tpl/Test/add.html
  }
}

//      dump($list);  

    ’id’=>’smallint’,

    ’id’=>’smallint’,

空操作:
在控制器中定义 _empty()
方法,当在眼前控制器中找不到相关的点猪时,会自个儿调用那几个点子
class TestAction extends Action
{
   protected function _empty($name)
   {

          

    ’user’=>’varchar’

    ’user’=>’varchar’

   }
}
同理可安装空控制器,当不存在时,就调用 class EmptyAction extends
Action{}

//    
 //二:跨模型操作;实例化一个表,同时实例化一个谈得来写的数据库操作类  

        )

        )

URL路由
平整路由
在布署文件 config.php中
‘URL_ROUTER_ON’ => true,
‘URL_ROUTE_RULES’ = array(
    ‘news/:id’ => ‘News/read’,
    ‘news/read/:id’ => ‘/news/:1’
);
当 localhost/index.php/news/1 会去拜访 News模块下的
read方法,并传播参数为id = 1,即
localhsot/index.php/News/read/id/1

        //多用于将有些国有的事务逻辑抽离出来形成集体的Model  

    );

    );

当localhost/index.php/news/read/10 会再次定向
localhsot/index.php/read/id/8
正则路由
不可以不是以”/”开端和终结

//      //M(‘user’,’CommonModel’)相当于new
CommonModel(‘user’);model是自动载入的  

        // …

        // …

URL重写,去index.php,可依据手册即可

////        $user=M(‘user’,’CommonModel’);  

  }

  }

URL生成,用U方法
U(‘[分组/模块/操作]?参数’ [,’参数1′, ‘伪静态后缀’, ‘是不是跳转’,
‘呈现域名’]);
U(‘User/add’) // 生成User模块下的 add 操作 URL
U(‘User/read?id=1’) // User 模块下的 read操作,并传播参数 id=1
U(‘Admin/User/select’) // Admin分组下的 User模块 select 操作
第四个参数可以是数组或者是字符串
U(‘Blog/cate’, array(‘cate_id’ => 1, ‘status’ => 1))
U(‘Blog/cate’, ‘cate_id=1&status=1’);
U(‘Blog/cate?cate_id=1&status=1’)
上述多个等价

//      $user=new CommonModel(‘user’);  

那儿在控制器下使用如下代码时:

那时在控制器下接纳如下代码时:

还帮衬路由功能
假使在模板文件中使用U方法的话,要求使用
{:U(‘[分组/模块/操作]?参数’ [,’参数1′, ‘伪静态后缀’, ‘是还是不是跳转’,
‘突显域名’])}

//      $list=$user->select();  

        $user=D(‘User’);

        $user=D(‘User’);

URL 大小写可配置,让其忽视,用U方法直接自动识别

4858.com ,//      dump($list);  

        $c[‘id’]=2;

        $c[‘id’]=2;

跨模块调用:
如在 index模块调用 blog模块的 test方法,:
class IndexAction extends Action
{
   public function index()
   {
      $blog = new BlogAction();
      $blog->test();
      //……
   }
}
还足以用A方法来调用:
A(‘[项目名://][分组/]模块名’);
class IndexAction extends Action
{
  public function index()
  {
    $blog = A(‘Blog’);
    $blog->test();
    //….
  }
}
A(‘User’) // 调用当前项目标 User 模块
A(‘Admin://User’) // 调用 Admin项目下的 User模块
A(‘Admin/User’) //Admin分组的 User模块
A(‘Admin://Tool/User’) // Admin 项目 Tool分组下的 User 模块

//      $user->modelTest();  

        $c[‘user’]=’樱桃小丸子’;

        $c[‘user’]=’樱桃小丸子’;

R表示调用一个模块下的某部操作方法:
R(‘[项目名://][分组名/]模块名/操作名’, array(param1, param2…))

          

        print_r($user->where($c)->select()); // 使用索引数组查询

        print_r($user->where($c)->select()); // 使用索引数组查询

R(‘User/info’, array(15))表示调用 User模块下的 info方法并传播参数 15

        //三:实例化一个用户定义的模子  

将不会询问到结果,除非注释掉手工字段,只怕使用M(‘User’)方法。

将不会询问到结果,除非注释掉手工字段,大概使用M(‘User’)方法。

页面跳转
打响时:在操作方法中用 $this->success(‘指示音信’, ‘跳转页面’);
破产时:$this->error(‘fail’);可定制,具体看手册

        //多用于不必要更进一步扑朔迷离的作业  

重定向 redirect();
在操作方法中用 $this->redirect(‘URL’, array($params), time,
‘提醒消息’);

       
//1.手动成立一个模子,针对user表创立一个自定义模型,可以封装thinkphp提供的意义
 

得到系统变量(可用PHP中的 $_GET,$_POST, $_SESSION, $_COOKIE …)
也可在 action 中调用如下方法
$this->方法名(‘变量名'[,过滤方法][,默认值]);
【4858.com】散乱笔记,实例化模型的多种方法。方法名为:_get,_post,_param,_put,_request,_session,
_cookie…可看手册
$this->_get(‘name’); 获取
$_GET[‘name’]的值,同时调用配置文件中默许的过滤方法
$this->_get(‘id’, ‘strip_tag’, 0); 调用
strip_tags过滤id值,若是没有值,则为0,如果没有安装默许值,则为null.

        //$user=new UserModel()相当于D(‘user’);  

$this->_get(); 获取全体变量值
$this->_get(‘name’, ‘strip_tags, htmlspecialchars’, 0);// 先用
strip_tags,再用htmlspecials方法过滤

       
//D方法倘使模型不存在,则抛出相当,只会实例一个,暗中同意,只扶助调用当前接纳上面的模型
 

闭馆过滤方法:
$this->_get(‘name’, false); 或者 $this->_get(‘name’, ”);

//      $user=new UserModel();  

看清请求类型:(GET,POST,PUT,DELETE,HEADE,AJAX)
在Action的操作方法中:
class UserAction extends Action
{
  public function index()
  {
     if($this->isPost()) // 是否为post提交,同时
isGet(),isPut().看手册
     {

//      $list=$user->select();  

     }else
     {

//      dump($list);  

     }

//      $user->modelTest();  

  }
}

          

获取URL参数
正常情形下.localhost/index.php/User/index/id/1
在UserAction.class.php的index方法中,
$_GET[‘_URL_’][0] // User
$_GET[‘_URL_’][1] // Index
$_GET[‘_URL_’][2] // id
….
也可用
$this->_param(1); // index
$this->_param(‘id’); // 1

        //四、实例化一个空模型;就是观念sql语句的方式;须求加表前缀  

ajax 返回
必须是ajax
调用
$this->ajaxReturn(“重回数据”, “提醒消息”, 操作状态 );

        //  

Action参数绑定
规律是把URL中的参数(不包含分组,模块,操作)和控制器中的方法参数绑定,URL:

class BlogAction extends Action
{
  public function read($id = 0)
  {
    // id = 5
    $Blog = M(‘Blog’);
    $Blog->find($id);
  }
 
  public function archive($year=2014, month=07)
  {
        $year = $year; // 2012
    $month = $month; //03
    //…..
  }
}

        $user=new Model();  

多层控制器辅助
A(‘User’, ‘Event’); // Lib/event/UserEvent.class.php
A(‘User’, ‘Api’) // Lib/Api/UserApi.class.php

        $list=$user->query(‘select * from tb_user’);  

模型相关

        dump($list);  

平整定义:
一旦表前缀为:think_
模型名(类名)  对应的表名
UserModel        think_user
UserTypeModel    think_user_type
设若不相符上述规则,要在模型里面定义相关属性
tableName 不包涵前缀的表名
trueTableName 包罗前缀的表名
dbName 定义模型当前对应的数据库
如:
class UsersModel
{
   protected $tableName = ‘user’; // 表示那一个模型其实对应的表为
think_user;
}
class UsersModel
{
  protected $dbName = ‘db’; // 定义对应的数据库
  protected $trueTableName = ‘top_test’; // 表示对应的是
top_test的表
}

          

模型实例化
可以无需举行任何模型定义,就可以简单利用CURD了,只有当要兑现部分作业逻辑封装时才用到
简单的CURD:
实例化User模型
$User = new Model(‘User’);
$User = M(‘user’);
$User->select();

        //分组:D(‘admin.user’);  

也足以在model中定义一个一而再model的类,完毕相应的逻辑(自定义的大概其他公共类)
class UserModel extends Model
{
  //….
}

    }  

$user = new UserModel(‘Admin’);
或者 $user = M(“UserModel:Admin”[, ‘表前缀’, ‘配置文件’]);

}  

D方法可支撑跨种类和分组调用
D(‘Admin://User’); // 实例化 Admin项目的 User模型
D(‘Admin/User’);   // 实例化 Admin 分组的 User模型

?>  

实例化空模型(使用原生态SQL)
$tt = new Model();
或者 $tt = M();
$res = $tt->query(“select * from think_test”);可扶助多表查询
$res = $tt->query(“select * form think_test, think_user”);

 

字段定义:
$fields = $User->getDbFields(); // 获取表的装有字段
一旦想每一遍得到的字段不是从表的社团中收获,恐怕想得到指定的字段,可在
Model中定义
class UserModel extends Model
{
 //此时用 getDbFields()只拿到里面指定的那有的
  protected  $fields = array(‘id, name’, ‘_pk’ => ‘id’, ‘_autoinc’
=> true);
  //…
}

多个模型:

赢得主键
$model->getPk();

[php]  

质量访问:可因此数据或对象属性子局
$User = D(‘User’);
$data = $User->find(1);
print_r($data->name); 或者 print_r($data[‘name’]);

<?php  

跨库操作
class UserModel extends Model
{
  protected $dbName = ‘user’; //对应的是 user数据库下的 user表
  protected $tablePrefix = ‘other_’; //不相同时,定义前缀
}

    class CommonModel extends Model{  

class Info Model extends Model
{
  protected $dbName = ‘info’; //对应的是 info数据库下的 info表
}

        function modelTest(){  

举办查询时,会活动处理
$User = D(‘User’);
$User->select(); // select * from user.think_user

            echo ‘测试的跨模型操作,调用模型中的方法’;  

假诺没有概念模型,用M方法时,可用:
$user = M(‘user.User’, ‘other_’);

        }  

成立数量:
$User = M(‘User’);
//依据表单的 post创设对象,
$User->create();
$User->add();

    }  

抑或最好用那种,可过滤
$User = M(‘User’);
$data[‘name’] = ‘lin3615’;
$data[‘pwd’] = ‘xxx22’;
$User->create($data);
$User->add();

?>  

或者
$User = M(‘User’);
$data[‘name’] = ‘lin3615’;
$data[‘pwd’] = ‘xxx22’;
$User->data($data)->add();

 

字段映射:
可以在表单中隐藏真实的数据表的字段新闻,可以直接付出,会自行转换
class UserModel extends Model
{
  protected $_map = array(
    ‘name’ => ‘username’, // 表单中的 name 字段映射为数据表的字段
username
    ‘mail’ => ’email’  // 表单中的 mail 字段映射为数据表的字段
email
  );
}

[php]  

用 parseFieldsMap() 方法了可把从数据表的字段映射为指定的别名字段:
$User = M(‘User’);
$data = $User->find(1); // 此时为数据表的真正字段
$data = $User->parseFieldsMap($data); // 即可映射为 name和mail这段

<?php  

$User->where(‘status=1’)->order(id
desc)->limit(10)->select();
当对表单提交的数量时用
$this->_post();
$this->_param();等时,会友善调用系统陈设的过滤函数
用$_POST(); $_REQUEST();则不会自行调用过滤函数

    class UserModel extends Model{  

机动验证
对表单的字段验证
在 Model类里面定义 $_validate属性,是一个二维数组
array(验证字段,验证规则,错误指示[,验证条件,附加条件,验证时间]);
class TestModel extends Model
{
  protected $_validate = array(
    array(‘verify’, ‘require’, ‘验证码必须’), // 默许用正则表明式验证
    array(‘name’,”, ‘账号名称已经存在’, 0, ‘unique’, 1), //
在疯长的时候证实name字段是还是不是唯一
    array(‘value’, array(1,2,3),’值的限制不得法’, 2, ‘in’), //
当值不为空的时候判断是不是在一个限制内
    array(‘repassword’, ‘password’,’确认密码不正确’, 0, ‘confirm’),
//验证确认密码是还是不是和密码一致
    array(‘password’, ‘checkPwd’, ‘密码格式不科学’, 0, ‘function’),
//自定义函数验证密码格式(checkPwd)
  );
}
当使用系统 create方法时会自动验证
$User = D(‘User’);
if(!$User->create())
{
  //若是验证失败!
  exit($User->getError());
}else
{
  // 通过
}
能够动态改变验证规则
$User = D(‘User’);
$validate = array(array(‘verify’, ‘require’, ‘验证码必须’)); //
仅仅要求展开验证码的求证
$User->setProperty(‘_validate’, $validate);
$result = $User->create();
if(!$result)
{
  // 失败
   exit($User->getError());
}else
{
   // 成功验证
}

          

手动验证
$validate = array(array(‘verify’, ‘require’, ‘验证码必须’));
$this->validate($validate)->create();

          

普普通通单个可用 check(‘验证数据’, ‘验证规则’, ‘验证类型’);
$model->check($value, ’email’);
$model->check($value, ‘1,2,3’, ‘in’);

        function modelTest(){  

取名范围:
尽管对接二连三贯操作举办包装,用_scope属性定义,用scope方法调用
class NewsModel extends Model
{
  protected $_scope = array(
   ‘normal’ => array(
            ‘where’ => array(‘status’ => 1),
            ),

            echo ‘测试的跨模型操作,调用模型中的方法’;  

   ‘latest’ => array(
        ‘order’ => ‘create_time desc’,
        ‘limit’ => 10,
    ),
  );
}
$_scope格式化:是一个数组:
‘命名范围标识名’ => array(‘属性名’=>’值’, ‘属性名’ => ‘值’,
…);
属性名包蕴:where,field,order,table ….(看手册)
用scope()方法调用
$model->scope(‘normal’)->select;
// select * from think_news where status = 1;

        }  

$model->scope(‘latest’)->select();
// select * from think_new order by create_time desc limit 10

    }  

可以调用多少个命名范围
$model->scope(‘normal’)->scope(‘latest’)->select(); 或者
$model->scope(‘normal,latest’)->select();
$sql = “select * from think_news where status=1 order by create_time
desc limit 10”;
假若命名范围存在争辨,后边的会覆盖前边的,假设不设有命名范围,则会忽略

?>  

暗中认同命名范围
protected $_scope = array(
    ‘default’ => array(),
    );
调用default时,可以不加default
$model->scope()->select()与
$model->scope(‘default’)->select();相同


命名范围调动
$model->scope(‘normal,latest’, array(‘limit’=>5))->select();
自定义命名范围
$model->scope(array(‘field’=>’id,title’,
‘limit’=>5))->select();

贯穿操作混合使用
protected $_scope = array(
    ‘normal’ => array(
        ‘where’ => array(),
        ‘field’=>’id, title’,
        ‘limit’ => 10,
    ),
);

机关已毕:
在 model类定义 $_auto属性,可机关落成数据处理效果
array(‘填充字段’,填充内容[,填充条件,附加条件]);
class MessageModel extends Model
{
  protected $_auto = array(
      array(‘status’, 1), // 新增时把status字段为1
      array(‘password’, ‘md5’, 1, ‘function’),
//对password字段在新增的时候使md5函数处理
      array(‘name’, ‘getName’,1, ‘callback’), //
对name字段在新增的时候回调getName方法
      ….
     );
}
务必调用 create 方法才生效和活动验证一样,当调用 create()时,会自行调用

可以动态设置:
$auto = array(
    array(‘password’, ‘md5’, 1, ‘function’),    
    );
$user->setProperty(‘_auto’, $auto);
$user->create();

还可动态设置规则
$this->auto($auto)->create();

$user = M(‘User’);
$user->where(type=1 and status = 1)->select();
select * from user where type=1 and status = 1;

$User=M(‘User’);
$condition[‘name’] = ‘thinkphp’;
$condition[‘stauts’] = 1;
$condition[‘_logic’] = ‘OR’;
$user->where($condition)->select();
select * from user where name=’thinkphp’ or status = ‘1’;

选取对象方式
$user = M(‘User’);
$condition = new stdClass();
$condition->name = ‘thinkphp’;
$condition->status = 1;
$User->where($condition)->select();

表明式查询
$map[‘字段名’] = array(‘表明式’, ‘查询条件’);
表达式: EQ,NEQ,GT,EGT,LT,ELT,LIKE,[NOT]BETWEEN,[NOT]IN,
EXP表明式查询,接济SQL语法

$map[‘id’] = array(‘eq’, 100);和 $map[‘id’] = 100等效,表示 id =
100
….
表达式查询  EXP
$map[‘id’] = array(‘in’, ‘1,2,3’);与 $map[‘id’] = array(‘exp’,
‘in(1,2,3)’);等效
exp查询的条件不会被当成字符串,所此前边的询问条件得以选取任何SQL帮忙的语法,包罗使用函数和字段名称。查询表明式不仅可用以查询条件,也可以用于数据更新
$User = M();
$data[‘score’] = array(‘exp’, ‘score+1’);
$User->where(‘id=5’)->save($data);

敏捷查询
$User = M(‘User’);
$map[‘name|title’] = ‘thinkphp’;
$User->where($map)->select();
查询条件为 name=thinkphp or title = thinkphp

$user = M();
$map[‘status&title’] = array(1,’thinkphp’, ‘_multi’=>true);
$user->where($map)->select();
status=1 and title=’think’
_multi=>true必须放在最终,能&,|无法同时利用

尖端模型
提供更加多的询问效能和模型增强成效,但要继承高级的模型或动态模型
class UserModel extends AdvModel
{

}
基本功模型类内置有多少自动达成功用,当只有用
create()方法时才生效,用高档模型则不用create(),即可达成
在 Model类中添加 $_filter属性
protected $_filter = array(
    ‘过滤字段’ => array(‘写入规则’,
‘读取规则’,是还是不是传入整个数据对象),
);
里面规则即为一个函数
也足以系列化字段, 用 $serializeField属性
protected $serializeField = array(
    ‘info’ => array(‘name’, ’email’, ‘address’),    
    );
此时会把 name,email,address的值系列化后保存在 数据表的
info字段中,读取时会自动反体系化
class UserModel extends AdvModel
{
   protected $_filter = array(
    ‘id’ => array(‘md5’, ‘md5’),
    );
   protected $serializeField = array(
    ‘info’ => array(‘name’, ’email’, ‘address’),
    ).    
}

$User = D(‘User’);
$User->name = ‘thinkphp’;
$User->email = ‘ssss@qq.com’;
$User->address = ‘gd’;
$User->add();//自动系列化后保存在数据库

读取时:
$User = D(‘User’);
$data = $User->select()->find(1);
//自动反系列化
$data[‘name’]; //’thinkphp’;
$data->[‘address’]; //’gd’;

多表查询
$model->table(
‘think_blog Blog,
think_category Category,
think_user user’)
->field(
 ‘Blog.id, Blog.name,Blog.title,
 Category.title as category_name,
 User.name as username’)
 ->order(‘Blog.id desc’)
 ->where(‘Blog.category_id=Category.id and Blog.user_id =
User.id’)
 ->select();
)

可用视图查询完结多表查询作用,得继续 ViewModel模型
class BlogViewModel extends ViewModel
{
  public $viewFields = array(
    ‘Blog’ => array(‘id’, ‘name’, ‘title’), // 表示从
blog中取id,name,title字段
    ‘Category’ => array(‘title’=>’category_name’,
‘_on’=>’Blog.Category_id =
category.id’),//表示category表中的title字段别名为 category_name,
连接条件是Blog.Category_id = category.id
    ‘User’=>array(‘name’=>’username’, ‘_on’=>’Blog.user_id =
User.id’),
  );
}
假设表名不一致,如 blog对应的为myblog,则在 ‘blog’ =>
array()中添加项:
‘_as’ => ‘myblog’
SQL语句为:
select Blog.id as id,
blog.name as name,
blog.title as title,
category.title as category_name,
User.name as username from think_blog blog join think_category
category
join think_user user
where blog.category_id = category.id and user.id = blog.user_id;

一往直前视图查询结果时:
$model = D(‘BlogView’);
$model->field(‘id,name,title,category_name,username’)->where(‘id>
10’)->order(‘id desc’)->select();

涉及模型:
就是三回在两个表完毕CURD
各个关系类型 HAS_ONE, BELONGS_TO, HAS_MANY,
MANY_TO_MANY,关联的定义格式:
必须继续 RelationModel类
class UserModel extends RelationModel
{
  protected $_link = array(
    ‘关联1’=>array(
          ‘关联属性1’ => ‘定义’,
          ….
          ‘关联属性N’=>’定义’,
    ),
    ‘关联2’=>array(
          ‘关联属性1’ => ‘定义’,
          ….
          ‘关联属性N’=>’定义’,
    ),
    ……
  );
}
如在操作 User表时,同时提到和操作
record,card那两张表时,若是为一定的关系,即HAS_ONE:
HAS_ONE关联的性质有:
mapping_type:关联类型,此为 HAS_ONE
class_name:要涉及的模型名,如 record,card(分别定义为 class RecordModel
extends Model{} ..),即会活动关联到相应的数量表 User(id,name,pwd),
record(id, score, userid), card(id, userid, accout)
mapping_name:关联映射名,用于获取数据,假如简单,则用
关联1可怜定义来取值
foreign_key:关联外键,此为那一个型的键,即 User表中的键
condition:关联条件
mapping_fields:要提到的字段,即这么些关联表的字段
as_fields:若是设置了,直接把其中的字段值和User的字段作为同级数据项,不然就是作为下拔尖数组项
class UserModel extends RelationModel
{
    protected $_link = array(
        ‘test1’ => array(
            ‘mapping_type’ => HAS_ONE,
            ‘class_name’ => ‘Record’,
            ‘mapping_name’ => ‘Record’, //
当作为二级数组项时,表示的下标同 User字段同一流别
            ‘foreign_key’ => ‘id’,
            ‘condition’ => ‘id>0’,
            ‘mapping_fields’ => ‘score’,
            ‘as_fields’ => ‘score:uus’,
            ),
        ‘Yes’ => array(
                ‘mapping_type’ => HAS_ONE,
                ‘class_name’ => ‘card’,
                ‘mapping_name’ => ‘aa’,
                ‘foreign_key’ => ‘id’,
                ‘mapping_fields’ => ‘id,accout’,
                //’as_fields’ =>’id:cardid’,
            ),

    );
}
$User = D(‘User’);
$User->relation(true)->select();
以上是 HAS_ONE的查询利用,CURD其实差不离
如扩大时
$User = D(‘User’);
$data = array();
$data[‘user’] = ‘xx’;
$data[‘test1’] = array(
            ‘score’ => 100,
        );
//以下的涉及下标一定是mapping_name 的值,假设那个从未设,则用
上级的关联名
$data[‘aa’] = array(
            ‘id’ => ”,
            ‘accout’ => ’90’,
        );

$result = $User->relation(true)->add($data);
BELONGS_TO与MANY_TO_MANY看手册

动态切换模型(如从基础到高级模型,视图模型)
$User = M(‘User’); // 实例化User对象 是基础模型类的实例
//动态切换来高档模型类
$User->switchModel(‘Adv’)->select();
//动态切换来视图模型类
$User->switchModel(‘View’)->select();

可以写成:
$User->M(‘AdvModel:User’); // 实例化User对象 是基础模型类的实例
$User->select();

要是要传播参数:
$User = D(‘User’);
// 动态切换来视图模型类 并传播view菲尔德s属性
$UserView = $User->switchModel(‘View’, array(‘viewFields’));

动态赋值:
$User = M(‘User’);
// 动态切换来关系模型类 并传播data属性
$advUser = $User->switchModel(‘Relation’);
// 大概在切换模型后再动态赋值给新的模子
$advUser->setProperty(‘_link’, $link);
// 查找关周密据
$user = $advUser->relation(true)->find(1);

多层模型支撑:
协助自定义分层,但是里面还中接二连三基类 Model
D(“User”);//实例化的是 Lib/Model/UserModel.class.php
D(‘User’, ‘Logic’); //实例化是 Lib/Logic/UserLogic.class.php
可以配备 DEFAULT_M_LAYER修改模型名(该参数暗中同意值为Model)

视图
暗中同意的沙盘文件定义规则:
模板目录/[分组名/][模板大旨/]模块名/操作名+模板后缀
模板目录暗许是项目目录下的Tpl,默许模板核心为空,是为切换多模板矶设计,多模板时,有
DEFAULT_THEME参数中安装默许模板
在各种模板大旨上面,是以项目标模块名为目录,然后是种种模块的具体操作模板文件,如:
User模块下的 add操作,对应的模版文件暗中同意就是
Tpl/User/add.html
暗许后缀为 .html,可在 TMPL_TEMPLATE_SUFFIX来布局成其余的
假设项目启动了分组功效,如 User模块属于 Home 分组,则专断承认模板对应是:
Tpl/Home/User/add.html
也可以陈设模板目录层次分隔符: TMPL_FILE_DEPR,如 TMPL_FILE_DEPR
=> ‘_’
Tpl/Home/User_add.html

模板赋值,用 assign();方法

模板输出:用display();
当下模块其余操作,如当前的edit操作模板;
$this->display(‘edit’); //不用模板文件路径和后缀

调用其他模块的操作:(Member模块下的read操作模板)
$this->display(“Member:read”);

display(‘主题名:模块名:操作名’);
如 Xp大旨的User模块的edit操作模板
$this->display(‘Xp:User:edit’);

直接全路线输出模板
display(‘模板文件名’);要指定后缀名
如:当前的 Public 目录下边的Menu.html模板文件;
$this->display(‘./Public/menu.html’);

$this->display(‘Member:read’, ‘utf-8’, ‘text/html’);

模板替换(看手册)

取得内容:
$this->fetch([模板:操作]);
用法与$this->display();相似,不过其是赢得
display();渲染后的沙盘内容,控制器中来操作

模板引擎
内置和原生的PHP,可在 TMPL_ENGINE_TYPE => ‘PHP’以高达最佳的效用

模板引擎:
变量输出(看手册)
{$name}
{$user[‘username’]}  {$user[’email’]}
{$user->username} {$user->email} {$user.username}
{$user[‘sub’][‘name’]] // 三级数组

系统变量,(看手册)
{$Think.}以$Think. 开头的,如:
{$Think.server.script_name}

行使函数:
{$varname|function1|function2=arg1,arg2,###}
{$webTtitle|md5|strtoupper|substr=0,3}
编译后:
<?php echo substr(strtoupper(md5($webTitle)), 0, 3); ?>
留意函数的概念和应用种种的呼应关系,常常来说函数的率先个参数就是前方的变量恐怕前一个函数调用的回到结果,即使你的变量并不是函数的首先个参数,需求动用固定符号
如上面:
md5()的参数是 $webTitle;
strtoupper();的参数是 md5($webTitle);
substr();参数是 strtoupper(md5($webTitle));

{$create_time|date=”Y-m-d”, ###}
date的第四个变量才是函数的参数,则用 ###代表,则编译后为:
<?php echo date(‘Y-m-d’, $create_time); ?>
还提供了在模板文件中直接行使PHP文件定义的函数方法
格式:{:function(…)}
{:U(‘User/insert’)} ==> <?php echo U(‘User/insert’); ?>
还足以推行函数,但不出口
格式:{~function(..)}
{~say_hell(‘tp’)} ==> <?php say_hell(‘tp’); ?>

暗中同意值输出,当不设有时就会输出默认值
{$变量|default=”默认值”}
{$lin|default=”hi,lin3615″}当$lin没有值时,则输出 hi,lin3615

行使用运算符:

  • {$a+$b}
  • {$a-$b}
    ….
    归纳运算 {$a+$b*10/5+$c-$d}
    不辅助点法和常规函数用法
    {$user[‘score’]+10}
    {$user[‘score’]*$user[‘score’]}

松手标签(看手册)

包括文件(include)
可以动用Include标签来含有外部的模板文件,
文件名要用完整的,相对项目根目录
<include file=”完整模板文件名” />
<include file=”./Tpl/Public/header.html” />

<include file=”操作名” />
<include file=”read” />
一定于含有于一致模块下的read操作中的模板,如:
class UserAction extends Action
{
  public function index()
  {

  }

  public function read()
  {
    $this->display();
  }
}
<include file=”read” />
那儿约等于含有 Tpl/User/read.html

<include file=”模块名:操作名” />都是对峙的沙盘模块
<include file=”Blog:read” />
即为 Tpl/Blog/read.html

饱含其余模板核心的模块操作模板
<include file=”主题名:模块名:操作名” />
<include file=”blue:User:read” />

也可用变量
<include file=”$tplName” />

也可传递变量
<include file=”read” title=”this is title” keyword=”keyword…”
/>
read.html代码
[title]
[keyword]
可被替换

可引入七个文件
<include file=”file1, file2″ />

导入文本:
<import type=”js” file=”js” />
<import type=”css” file=”stysheet” />
type:暗中认同值为 js.还是可以是css
此时相当于(根目录)
<script type=”text/javascript”
src=”Public/js.js”></script>
<import type=”js” file=”js” basepath=”./Common/javascript” />
相对于
<script type=”text/javascript”
src=”./Common/javascript/js.js”></script>

load标签导入 js/css文件
<load />
<load />
自动识别,直接根目录
<js />
相当于
<script type=”text/javascript”
src=”Public/js/js.js”></script>

<css />
相当于
<link rel=”stylesheet” type=”text/css” />

Volist标签主要用来在模板中循环输出数据集恐怕多维数组。(看手册)
<Volist name=”list” id=”vo” offset=”5″ length=”10″ key=”i” mod=”5″
empty=”不存在”>
   {$vo.name}
   {$vo.id}
   <eq name=”mod” value=”4″></eq>
</Volist>

foreach标签 也是用以循环输出
<foreach name=”list” item=”vo” key=”i”>
{$vo.name}
</foreach>

For标签用于落到实处for循环
<for start=”开始值” end=”结束值” comparison=”” step=”” name=””>

</for>

<for start=”1″ end=”100″>
{$i]
</for>
相当于
for($i=1; $i < 100; $i++)
{
   echo $i;
}

switch标签:
<switch name=”变量”>
  <case value=”” break=”0或1″>输出内容</case>
  <case value=””>输出内容2</case>
  <default />内容
</switch>

相比标签(eq,equal,notequal,neq,gt,lt,….)
<相比标签 name=”变量” value=”值”>内容</相比较标签>
<eq name=”name” value=”value”>value</eq>
<equal name=”name” value=”value”>value</equal>

<eq name=”name” value=”value”>相等<else
/>不相等</eq>

<compare name=”name” value=”5″ type=”eq”>value</compare>

伊利运算
{$status ? ‘yes’ : ‘no’}

限定标签
<in name=”id” value=”1,2,3″>xxx</in>
<notin name=”id” value=”1,2,3″>yyy</notin>
<between name=”id” value=”1,2″>xxx</between>//
其中value唯有是五个值时期
<notbetween name=”id” value=”1,10″>aaaaa</notbetween>

<range name=”id” value=”1,2,3″ type=”in”></range>

present 标签,判断是不是赋值
<present name=”name”>name已经赋值</present>
<notpresent name=”name”>name还尚未赋值</notpresent>

empty标签,判断是不是为空,同理defined
<empty name=”name”>name为空</empty>
<notempty name=”name”>name不为空</notempty>

Define 标签,举行常量定义
<define name=”LIN” value=”3615″ />
在运转模板的时候 定义了一个LIN的常量

assign标签赋值
<assign name=”var” value=”lin3615″ />
在运行模板的时候 赋值了一个var的变量,值是lin3615

if标签,条件判断,不可以用传统的 <,>=,!=…
<if condition=”($name eq 1) or ($name gt 100)”>
xx
<else if condition=”$name eq 2″ />
222
<else />
ssss
</if>

标签嵌套,一般的价签都足以嵌套,暗中同意嵌套时最多为三级,通过TAG_NESTED_LEVEL配置参数设置嵌套级别

利用php代码,在中间的非PHP标签不起作用
php标签
<php>
echo ‘hi, lin3615’;
</php>
原生态 php
<?php echo ‘hi,lin3615’;?>
比方设置了TMPL_DENY_PHP参数为true,就无法在模板中使用原生的PHP代码,可是仍然支撑PHP标签输出

模板布局
实际上就是把相应的始末放在模板里面作渲染输出(只输出模板里面的)
二种布局模板
第一种艺术是 以布局模板为进口的点子
该方法须要配备开启LAYOUT_ON
参数(暗中同意不打开),并且安装布局入口文件名LAYOUT_NAME(默认为layout)。
class UserAction extends Action
{
  public function add()
  {
    $this->display(‘add’);
  }
}
在不开启LAYOUT_ON布局模板此前,会平昔渲染Tpl/User/add.html
模板文件,开启之后,把add.html内容会渲染Tpl/layout.html
模板中,并把layout.html中的{__CONTENT__}替换为add.html中的内容
layout.html
任何内容(如引入底部内容,样式表….)
{__CONTENT__}

假如不必要使用布局模板,可在模板文件add.html中涵盖
{__NOLAYOUT__}即可

其次种办法是以当下出口模板为进口的主意
那种方式的输入仍然在User/add.html
模板,不过我们得以修改下add模板文件的始末,在头顶增添上边的布局标签:
<layout name=”layout” />
layout.html中的内容与第一种的情节同样

模板继承
事实上就是概念一个基础模板(或是布局),相关内容用<block>标签来分化,各种区块由<block
name=””></block>组成,name属性一定要唯一
如定义一个基础的模版:
base.html
<block name=”title”><title>the
header</title></block>
…………
<block name=”jsfiel”><include file=”js.js”
/></block>

在index.html中援引上面的块时(用到继承):
<extend name=”base” />
<block
name=”title”><title>{$title}</title></block>
<block name=”jsfile”></block>

literal标签:原样输出(防止模板解析)
<literal>
    <if condition=”” >
    sssss
    </if>
</literal>

<php><literal><if
condition=””></if></literal></php>

模板注释
格式:{/* 注释内容 */} 或 {// 注释内容}

避免JS混淆(即解析)
1.{}在分隔符之间留空格
2.<literal>JS代码</literal>
3.修改默许分隔符


发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有