• ThinkPHP3快速入门教程二:数据CURD


    CURD(创建[Create]、更新[Updata]、读取[Read]、删除[Delete]),定义了用于处理数据的基本原子操作。

    CURD在具体的应用中并非一定使用createupdatareaddelete字样的方法,但是他们完成的功能是一致的。

    例如:

    ThinkPHP就是使用addsaveselectdelete方法表示模型的CURD操作。

    一、创建数据

    CURDCreate操作通常会通过表单来提交数据,首先,我们在项目的Tpl/Form目录下面创建一个add.html模板文件,内容为:

    <FORM method=”post” action=”_URL_/insert”>

    标题:<input type=”text” name=”title”><br/>

    内容:<textarea name=”content” rows=”5” cols=”45”></textarea><br/>

    <input type=”submit” value=”提交”>

    </form>

    在项目的Action目录下面创建一个FormAction.class.php文件,暂时只需要定义FormAction类,不需要添加任何操作方法,代码如下:

    Class FormAction extends Action {}

    接下来,访问:http://localhost/app/index.php/Form/add

     

    注意:

    我们并没有在控制器里面定义add操作方法,但是很显然,访问是正常的。

    原因:

    因为ThinkPHP在没有找到对应操作方法的情况下,会检查是否存在对应的模板文件,由于我们有对应的add模板文件,所以控制器就直接渲染该模板文件输出了。

    所以说对于没有任何实际逻辑的操作方法,我们只需要直接定义对应的模板文件就行了。

     

    表单处理:

    Class FormAction extends Action {

    public function insert(){

    $Form = D(‘Form’);

    If($Form -> create()){

      $result = $form->add();

    If($result){

    $this -> success(‘操作成功!’);

    }else{

    $this -> error(‘写入错误!’);

    }

    }else{

    $this -> error($Form -> getError());

    }

    }

    }

    如果你的主键是自增类型的话,add方法的返回值就是该主键的值。

    不是自增主键的话,返回值表示插入数据的个数。如果返回false则表示写入出错。

     

    二、模型

    think_form表:

    CREATE TABLE IF NOT EXISTS ‘think_form’ (

    ‘id’ smallint(4) unsigned NOT NULL AUTO_INCREMENT,

    ‘title’ varchar(255)  NOT NULL,

    ‘content’ varchar(255) NOT NULL,

    ‘create_time’ int(11) unsigned NOT NULL,

    PRIMARY KEY (‘id’)

    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    注意:D函数和M函数不同,需要有对应的模型类。

    创建模型类:

    模型名的定义规范:模型名+Model.class.php(模型名的定义采用驼峰法并且首字母大写)

    我们在项目的Lib/Model目录下面创建FormModel.class.php文件,添加代码如下:

    Class FormModel extends Model {

    //定义自动验证

    Protected $_validate = array(

    Array(‘title’,’require’,’标题必须’),

    );

    //完成自动完成

    Protected $_auto = array(

    Array(‘create_time’,’time’,1,’function’),

    );

    }

    主要用于表单的自动验证和自动完成。

    如果使用D函数实例化模型类,一般需要对应一个数据模型类,而且create方法会自动把表单提交的数据进行自动验证和完成(如果有定义的话)。

     

    如果验证成功,就表示数据对象已经成功创建,但目前只是保存在内存中,直到我们调用add方法写入数据到数据库。这样就完成了一个完整的Create操作,所以可以看到ThinkPHP在创建数据的过程中使用了两步:

    第一步,create方法创建数据对象,

    第二步,使用add方法把当前的数据对象写入数据库

    当然可以完全跨越第一步,直接进行第二步,但是这样的预处理有几个优势:

    1、无论表单有多复杂,create方法都可以用一行代码轻松创建数据对象,

    2、在写入数据之前,可以对数据进行验证和补充;

    目的:确保写入数据库的数据安全和有效。

    效果:验证完毕不输入标题就直接提交表单的话,系统会给出标题必须这样的提示信息。

     

    如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:

    $Form = D(‘Form’);

    $data[‘title’] = ‘ThinkPHP’;

    $data[‘content’] = ‘表单内容’;

    $Form->add($data);

    也可以支持对象方式操作:

    $Form = D(‘Form’);

    $Form -> title = “ThinkPHP”;

    $Form -> content = “表单内容”;

    $Form -> add();

    对象方式操作的时候,add方法无需传入数据,会自动识别当前的数据对象赋值。

     

    三、读取数据

    我们可以通过find方法获取一个单一数据,定义read操作方法如下:

    Public function read($id=0){

    $Form = M(‘Form’);

    //读取数据

    $data = $Form -> find($id);

    If($data){

    $this->data = $data;//模板变量赋值

    }else{

    $this->error(‘数据错误’);

    }

    $this->display();

    }

    read操作方法有一个参数$id,表示我们可以接受URL里面的id变量(

    这里用M方法而没有用D方法,是因为find方法是基础模型类Model中的方法,

    所以没有必要浪费开销去实例化FormModel类(即使已经定义了FormModel类)。

    我们通常采用find方法读取某个数据,这里使用了AR模式来操作,所以没有传入查询条件,

    Find($id)表示读取主键为$id值的数据,find方法的返回值是一个如下格式的数组:

     

     

    Array(

    ‘id’      =>   5,

    ‘title’     =>  ‘测试标题’,

    ‘content’  =>  ‘测试内容 ’,

    ‘status’   =>  1,

    然后我们可以在模板中输出数据,添加一个read模板文件,

    <table>

    <tr>

    <td>id;</td>

    <td>{$data.title}</td>

    </tr>

    <tr>

    <td>标题:</td>

    <td>{$data.title}</td>

    </tr>

    <tr>

    <td>内容:</td>

    <td>{$data.content}</td>

    </tr>

    </table>

    访问路径:http://localhost/app/index.php/Form/read/id/1

    查询某个字段可以使用getField方法:

    $Form = M(Form);

    //获取标题

    $title = $Form -> where(‘id=3’)->getField(‘title’);

    四、更新数据

    对数据进行更新,添加一个编辑表单的模板文件edit.html,如下:

    <FORM method=”post” action=”_URL_/update”>

    标题:<input type=”text” name=”title” value=”{$vo.title}”><br/>

    内容:<textarea  name=”content” rows=”5” cols=”45”>{$vo,content}}</textarea>

    <br/>

    <input type=”hidden” name=”id” value=”{$vo.id}”>

    <input type=”submit” value=”提交”>

    </FORM>

    因是更新数据所以只对模板进行变量赋值,所以,我们这次需要在FormAction类添加两个操作方法:

    Public function edit($id=0){

    $Form = M(‘Form’);

    $this -> vo = $Form -> find($id);

    $this -> display();

    }

    Public function update(){

    $Form = D(‘Form’);

    If($Form->create()){

    $result = $Form->save();

    If($result){

    $this -> success(‘操作成功!’);

    }else{

    $this -> error(‘写入错误!’);

    }

    }else{

    $this->error($Form->getError());

    }

    }

    数据的更新操作在ThinkPHP使用save方法进行保存更新数据,

    Create方法创建表单提交数据。

    更新条件其实就是表的主键,这就是我们在编辑页面要把主键的值作为隐藏字段一起提交的原因。

    不依赖表单提交的更新操作

     

    $Form = M(“Form”);

    // 要修改的数据对象属性赋值

    $data[‘id’] = 5;

    $data[‘title’] = “ThinkPHP”;

    $data[‘content’] = ‘ThinkPHP3.1版本发布’;

    $Form -> save($data); //根据条件保存修改的数据

    Save方法会自动识别数据对象中的主健字段,并作为更新条件。

     

    显示传入更新条件:

    $Form = M(“Form”);

    //要修改的数据对象属性赋值

    $data[‘title’] = ‘ThinkPHP’;

    $data[‘content’] = ‘ThinkPHP3.1版本发布’;

    $Form -> where‘id=5’->save($data); //根据条件保存修改的数据

    可以改成对象方式来操作:

    $Form = M(“Form”);

    //要修改的数据对象属性赋值

    $Form->title = ’ThinkPHP’;

    $Form->content = “ThinkPHP3.1版本发布”;

    $Form->where(‘id=5’)->save();//根据条件保存修改的数据

    数据对象赋值的方式,save方法无需传入数据,会自动识别。

    Save方法的返回值是影响的记录数,如果返回false则表示更新出错。

     

    有些时候,我们只需要修改某个字段的值,就可以使用setField方法,而不需要每次都调用save方法。

    $Form = M(“Form”);

    //更改title

    $Form -> where(‘id=5’) -> setField(‘title’,’ThinkPHP’);

    对于统计字段,系统还提供了更加方便的setIncsetDec方法。

    例如:

    $user = M(“user”);  //实例化User对象

    $User -> where(‘id=5’)->setInc(‘score’,3); //用户的积分加3

    $User ->where(‘id=5’)->setInc(‘score’); //用户的积分加1

    $User->where(‘id=5’)->setDec(‘score’,5); //用户的积分减5

    $User->where(‘id=5’)->setDec(‘score’); //用户的积分减1

    五、删除数据

    删除数据很简单,只需要调用delete方法,例如:

    $Form=M(‘Form’);

    $Form -> delete(5);

    表示删除主键为5的数据,delete方法可以删除单个数据,也可以删除多个数据,这取决于删除条件,例如:

    $User = M(“User”); //实例化User对象

    $User -> where(‘id=5’)->delete(); //删除id5的用户数据

    $User -> delete(‘1,2,5’); //删除主键为125的用户数据

    $User -> where(‘status=0’)->delete(); //删除所有状态为0的用户数据

    Delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。

    六、总结

    Create方法:创建数据

    Add方法: 添加数据

    Save方法:   保存数据

    Delete方法:删除数据

    getField方法:获取单个信息字段

    setField方法:设置单个信息字段

  • 相关阅读:
    extract numberic from text
    str.rfind("//")
    solr入门心得
    深挖洞,广积粮,缓称王
    ubuntu 查看文件夹大小

    关于托运
    iconv转换文件编码
    小毛小毛你的心态
    广积粮,高筑墙,缓称王
  • 原文地址:https://www.cnblogs.com/john-sr/p/6009691.html
Copyright © 2020-2023  润新知