zoukankan      html  css  js  c++  java
  • TP5 模型CURD

    ThinkPHP5的模型是一种对象-关系映射(Object / Relation Mapping ,简称 ORM)的封装,并且提供了简洁的ActiveRecord实现。一般来说,每个数据表会和一个“模型”对应。

     ThinkPHP5 模型类和Db类的区别主要在于对象的封装,Db类的查询默认返回的是数组(或者集合),而模型类返回的是当前的模型对象实例(或者集合)模型是比Db类更高级的数据支持模型关联、模型事件

    ThinkPHP5 模型属性$table 不再是包含表前缀的表名;$name则是包含表前缀的表名

    一般来说,模型的属性名 就是对应的数据表的字段名

    Model模型类

    · protected  $name; //包含表前缀的数据表

    · protected  $table; //不包含表前缀的数据表,使用的时候要加上表前缀

    : protected  $table = ‘tp_admin_user’; 

    模型类 public类型属性 就是对应的表的字段名。如果给模型类的属性不对应字段名的话,会报错

    $user = new User; // User为模型类

    $user->user_name = ‘admin’; // useruser_name 字段

    $user->password = md5(‘123456’); // userpassword 字段

    $user[‘user_name’]  等同  $user->username;

     疑惑:如果此时使用save()方法,会是修改 还是 什么情况?

    $user->save(); //此时为新增!!!

    因为当 $user对象没有给定 主键的时候,此时为新增; 如果给定主键,此时为修改!

    另外一种新增数据为 模型::create();

    那么问题来了,什么时候使用save() create()呢?

    ·新增数据

    由此可见,当实例化模型的时候,使用 save() saveAll() 方法进行添加。

    如果使用 模型类, 就使用 XXModel::create(); 进行添加

    $user = new User; // User为模型类

    此时$user->save($data)  或  User::create($data);   两者返回的还是模型的实例化对象,不同的是User模型类create()后 返回的是 新new的对象而已。

    --------------------------------------------

    批量新增数据

    实际操作的时候,是执行了多条的insert into 数据。并非真的一次性插入。


    查询

    · getBy字段名();  查询对应的单条查询,字段名第一个字母要大写!

       : 查询 level_id字段的值为4的这条信息

    $user->getByLevelId(4);

       如:查询 name 字段的值为 admin的这条信息

    $user->getByName(‘admin’);

    $user = new User; //User 为模型类

    $user->getBy字段名(‘值’); //返回当前 字段名= 值 的这条信息.

    $user->getData(); //可以将单条信息 转换为 数组

    注意:getBy字段名(),  如果字段名有”_” 同样将首字母和_后的首字母转为大写!!!

    ·get() 可查询主键 或 非主键

    如:查询主键为1的单条信息

    $user->get(1);

    如:表没有主键,可使用数组来传递查询

    $data = [‘name’=>’site_name’];

    $user->get($data); //查询没有主键的 单条数据

    使用 where为追加条件

    $map = ['level_id'=>2];

    $result3 = $model->where($map)->find();


    更改

     

    $user = new User; //User为模型类

    $user->save($data,  $where条件);

    Model::update($dasta, $where条件);

    上面讲过,如果没有给定主键 此时 $user->save(); 为新增,如果当表中没有主键怎么办?

    $user->isUpdate(true)->save();  //强制为更新操作

    以下内容为知识扩展,不要拿到实战中,否则潜在问题会困扰很久!!

    还有一种情况是  $user = User::get(1); $data = [.. ...]; 如果没有给定主键,是新增吗?

    答案是修改!!!  因为$user User::get(1)返回的对象,1就是主键,所以此时为修改,并非进行新增操作!!!

    问题又来了,如果我现在就想把$user->save($data);  为新增,该怎么操作?

    答: $user->主键 = NULL;  $user->isUpdate(false)->save($data); 此时为新增操作。

    问题又来了,新增后的数据信息,除了主键,$data中不存在的信息,则是复制User::get(1)默认的数据!!!!! 这招太坑

    最好使用 Model::create() 或 干脆直接new Model save(),一般不建议使用 User::get(1) 这种直接返回实例化的对象 再进行CURD;


      

    删除操作

    Model::destory(主键id);

    如: User::destroy(33); // 删除主键33的单条信息

    对象->where(条件)->delete();

    :  $user->where(‘id =5 ’)->delete(); //删除主键5的单条信息

    学习模型总结:

    ·新增数据

    ·批量新增

    ·查询数据

    ·数据列表

    ·更新数据

    ·删除数据

    小技巧总结:

    ·获取模型类对应表的字段名, new 模型类,再使用 属性进行相关操作

      :   $user = new User; //User为模型类

    $user->user_name 与  $user[‘user_name’] 等同!!

    因为基类Modeimplements ArrayAccess , 可以将属性当成数组的形式来访问。

    ·数据表存在“_”的问题

      如果数据表存在下划线,将下划线去掉,模型的名字首字母大写。

     如: tp_admin_user,  对应的模型名 AdminUser .

    ·如果数据表 与 当前模型名称不一致,怎么办?

     在模型类内  protected $name =”要关联的表名”;

      : tp_admin_user,    User模型   protected $name = ‘user’;

    ·模型类 或 模型对象 get() find() 查询后的结果 怎么转成数组?

    通过 getData()方法,

    :  $result = $user->find(1);  $result->getData();

    ·模型类 或 模型对象 all() select() 查询后的结果 怎么转数组?

      此时查询的多条信息为 结果集!! 不能使用getData()一次性转数组,

    可以使用foreach() 来逐条转为数组,但太麻烦!!!。

    通过 collection(结果集)->toArray();

    如: $result = $user->select();  $data = collection($result)->toArray();

  • 相关阅读:
    重装系统之后应装软件
    中文乱码解决方案
    买电脑需要考虑的电脑配置
    JavaBean个人总结
    Servlet个人总结
    web.xml详解
    默认软件
    Eclipse导入项目
    Eclipse插件安装
    Tomcat详解
  • 原文地址:https://www.cnblogs.com/lanren2017/p/9153311.html
Copyright © 2011-2022 走看看