美文网首页
数据库与模型

数据库与模型

作者: 圆咚咚CodingLife | 来源:发表于2019-03-11 14:57 被阅读1次

阅读原文

项目示例使用MySQL数据库

一、数据库

1、修改项目设置

打开config\app.php修改配置

2、数据库连接

  • 数据准备
  • 全局配置

打开config\database.php修改配置

   public function conn()
   {
       return Db::table('student')
       ->where('id','2')
       ->value('name');
   }
  • 动态配置
   public function conn2()
   {
       return Db::connect([
           'type'=>'mysql',
           'hostname'=>'localhost',
           'database'=>'demo',
           'username'=>'root',
           'password'=>'root',
       ])
       ->table('student')
       ->where('id','5')
       ->value('name');
   }
  • DSN连接
   public function conn3()
   {
       $dsn = 'mysql://root:root@localhost/demo#utf8';
       return Db::connect($dsn)
       ->table('student')
       ->where('id','3')
       ->value('name');
   }

3、增删改查操作

  • 单条查询
public function find()
   {
       /**
        * Db类数据库操作的入口类
        * 功能:静态调用think\db\Query.php类中的查询方法实现基本操作
        * table():选择数据表
        * field():用来设置返回的字段或别名
        * where():设置查询条件 表达式,数组
        * 1、单个条件 使用表达式
        * 2、对于多个条件使用数组
        * find()返回符合条件的第一条记录,没有的话返回null
        */

       // $res = Db::table('student')
       // ->field('id,name,email')
       // ->field(['id'=>'编号','name'=>'姓名','email'=>'邮箱'])
       // ->where('id',4) //如果是相等关系 = 可忽略
       // ->find();
       // dump(is_null($res) ? '没有找到' : $res);

       $res = Db::table('student')
       ->field('id,name,email')
       ->find(5); //如果是主键查询,可省略where()
       dump(is_null($res) ? '没有找到' : $res);
   }

单条查询原理

【问题】

//返回字段设置别名出错,暂时还没找到原因?
->field(['id'=>'编号','name'=>'姓名','email'=>'邮箱'])
  • 多条查询

    public function select()
    {
        //select()返回的是一个二维数组,没有数据返回是一个空数据
        $res = Db::table('student')
        ->field('id,name,email')
        ->where([
            ['age','=',18],
            ['id','<=',5]
        ])
        ->select();
    
        if (empty($res)){
            return '没有满足条件的记录';
        } else {
            foreach ($res as $row)
            {
                dump($row);
            }
        }
    }
    

    多条查询原理

  • 单条插入

    public function insert()
    {
        //insert()成功返回新增的数量,失败返回false
        //准备一下要插入的数据
        $data = [
            'name'=>'金毛狮王4',
            'age'=>52,
            'email'=>'jinmaoshiwang2@163.com',
        ];
    
        // return Db::table('student')->insert($data);
    
        //只有数据库类型为MySQL的时候,才可以传入true
        //REPLACE INTO方式插入,性能更高
        // return Db::table('student')->insert($data,true);
    
        //data()方法对数据进行过滤,更安全,insert不支持参数true
        // return Db::table('student')->data($data)->insert();
    
        //插入的同时返回新增主键ID
        //insertGetId()同时执行两步:第一步插入,第二步返回主键ID
        return Db::table('student')->insertGetId($data);
    }
    

    insertGetId原理

  • 多条插入

    public function insertAll()
    {
        $data = [
            ['name'=>'多条插入','age'=>1,'email'=>'duotiao@163.com'],
            ['name'=>'多条插入1','age'=>2,'email'=>'duotiao1@163.com'],
            ['name'=>'多条插入2','age'=>3,'email'=>'duotiao2@163.com'],
        ];
    
        // return Db::table('student')->insertAll($data);
        return Db::table('student')->data($data)->insertAll();
    }
    

    多条插入原理

  • 更新操作

    public function update()
    {
        //update()必须要有更新条件
        // return Db::table('student')
        // ->where('id',2)
        // ->update(['name'=>'郭靖被修改了']);
    
        //如果更新条件是主键的话,可以直接把主键写到更新数组中
        return Db::table('student')
        ->update(['name'=>'郭靖被修改了','id'=>2]);
    }
    

    更新原理

  • 删除操作

    public function delete()
    {
        // return Db::table('student')
        // ->delete(13);
    
        return Db::table('student')
        ->where('id',12)
        ->delete();
    }
    

    删除原理

  • 原生查询

    public function query()
    {
        $sql = "SELECT `id`,`name`,`email` FROM `student` WHERE `id` IN (3,4,5)";
        dump(Db::query($sql));
    }
    
    
  • 原生写操作:更新,删除,添加

    public function execute()
    {
        // return Db::execute("UPDATE `student` SET `name`='武松' WHERE `id`=10");
        // return Db::execute("INSERT `student` SET `name`='宋江'");
        return Db::execute("DELETE FROM `student` WHERE `name`='宋江'");
    }
    

二、模型

1、模型定义

定义一个Student模型类很简单:

<?php

namespace app\demo\model;

use think\model;

class Student extends model
{

}

请确保你已经在数据库配置文件中配置了数据库连接信息

模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,例如:

模型名称 模型名 约定对应数据表(假设数据库的前缀定义是 think_
User think_user
UserType think_user_type

模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的table属性。

如果担心模型的名称和PHP关键字冲突,可以启用类后缀功能,只需要在应用配置文件app.php中设置:

// 开启应用类库后缀
    'class_suffix'           => true,

开启后,所有的应用类库定义的时候都需要加上对应后缀,包括控制器类。

这样app\demo\model\Student类定义就要改成

<?php
namespace app\demo\model;

use think\Model;

class StudentModel extends Model
{
}

并且文件名也要改为StudentModel.php

大多数情况下,不同模块的模型是不需要独立的,因此可以统一在common模块下面定义模型。

2、模型设置

默认主键为id,如果你没有使用id作为主键名,需要在模型中设置属性:

<?php
namespace app\demo\model;

use think\Model;

class Student extends Model
{
    protected $pk = 'sid';
}

5.1中模型不会自动获取主键名称,必须设置pk属性。

如果你想指定数据表甚至数据库连接的话,可以使用:

<?php
namespace app\ demo\model;

use think\Model;

class Student extends Model
{
    // 设置当前模型对应的完整数据表名称
    protected $table = 'think_student';
    
    // 设置当前模型的数据库连接
    protected $connection = 'db_config';
}

connection属性的建议用配置参数名(需要在database.php中添加)而不是具体的连接信息,从而避免把数据库连接固化在代码里面。

常用的模型设置属性包括(以下属性都不是必须设置):

属性 描述
name 模型名(默认为当前不含后缀的模型类名)
table 数据表名(默认自动获取)
pk 主键名(默认为id)
connection 数据库连接(默认读取数据库配置)
query 模型使用的查询类名称
field 模型对应数据表的字段列表(数组

3、模型初始化

模型同样支持初始化,与控制器的初始化不同的是,模型的初始化是定义Modelinit方法,具体如下

<?php
namespace app\demo\model;

use think\Model;

class Student extends Model
{

    // 模型初始化
    protected static function init()
    {
        //TODO:初始化内容
    }
}

模型初始化方法通常用于注册模型的事件操作。

init必须是静态方法,并且只在第一次实例化的时候执行

4、模型操作

在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版。

模型的查询方法无需和数据库查询一样调用table或者name方法,因为模型会按照规则自动匹配对应的数据表,例如:

Db::name('Student')->where('id','>',10)->select();

改成模型操作的话就变成

Student::where('id','>',10)->select();

虽然看起来是相同的查询条件,但一个最明显的区别是查询结果的类型不同。
第一种方式的查询结果是一个(二维)数组,而第二种方式的查询结果是包含了模型(集合)的数据集。不过,在大多数情况下,这二种返回类型的使用方式并无明显区别。

更多操作参考示例代码

总结

这一章讲了数据库与模型技术相关操作,

  • 数据库介绍了配置连接的各种方式,CURD常规操作,示例代码参考demo\controller\DataBase.php
  • 模型介绍了数据表的映射关系,方便数据操作,示例代码参考demo\controller\Model.php

同时感谢PHP中文网 的教学资源...

以上均是自学过程的积累,学到哪记到哪

原创文章,转载请注明出处,谢谢!

相关文章

  • HelloDjango - Python+Django+xadm

    第二篇我们来学习模型的建立。 模型 Django模型Models是与数据库相关的,与数据库相关的代码一般写在mod...

  • Flask-SQLAlchemy创建数据库表,增删改查

    1.创建数据库配置文件 2.初始化数据库对象。 导入sqlalchemy,配置文件 3.数据库模型与表映射。 模型...

  • CDM(概念数据模型)转换

    概念数据模型完成数据库的概要设计,逻辑模型是概念数据模型的进一步分解和细化,物理数据模型则完成与具体数据库管理系统...

  • 数据库基础

    1、数据库视图与数据模型 数据抽象:物理层、逻辑层和视图层 逻辑层使用数据模型:1、概念数据模型,用于数据库的设...

  • beego框架学习之MVC

    - 模型(Model): 通常来说,模型类将包含取出、插入、更新数据库资料等这些功能,主要用来与数据库交互,目前b...

  • 管理器 Manager

    管理器是 Django 的模型进行数据库的查询操作的接口 ,用于与数据库进行交互,Django 应用的每个模型都拥...

  • java day 20

    数据库 关系型数据库与非关系型数据库1.关系型数据库关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及...

  • Django-MTV

    MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Templa...

  • 2019-05-27 django

    MTV模型 Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示...

  • ## WCDBSwift 的简单使用与封装

    WCDBSwift 的简单使用与封装 模型例子 DBManager 创建数据库管理

网友评论

      本文标题:数据库与模型

      本文链接:https://www.haomeiwen.com/subject/okcbpqtx.html