php 反射 orm,PHP数据库操作:使用ORM

之前我发了一篇博文PHP数据库操作:从MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL数据库的。本文介绍如何使用ORM操作数据库。

什么是ORM呢?引用网友的话:

ORM 对象关系映射,O(Object) 对象,在项目中就是实体,更加精确的来说就是数据Model,也可以说持久化类。R(Relation) 关系数据,M (Mapping)映射,将对象映射到关系数据,将关系数据映射到对象的过程。更加直观理解就是,ORM 就是以OOP思想,产生增删改查SQL语句。

相比PDO,ORM更适合快速开发项目,而不用写SQL语句。下面介绍几个好用的ORM。

Medoo

下文均以版本1.0.2为例。

环境要求

PHP 5.1+, 推荐PHP 5.4+ 且支持PDO.

至少安装了MySQL, MSSQL, SQLite其中一种.

如何安装

Medoo支持Composer安装和直接下载。

使用Composer安装:

composer require catfan/Medoo

composer update

开始使用

引入Medoo并配置数据库:

//使用Composer安装的这样引入

//require 'vendor/autoload.php';

// 直接下载的这样引入

require_once 'medoo.php';

// 初始化

$db = new medoo([

'database_type' => 'mysql',

'database_name' => 'test',

'server' => 'localhost',

'username' => 'root',

'password' => '123456',

'charset' => 'utf8',

//可选:端口

'port' => 3306,

//可选:表前缀

'prefix' => '',

// PDO驱动选项 http://www.php.net/manual/en/pdo.setattribute.php

'option' => [

PDO::ATTR_CASE => PDO::CASE_NATURAL

]

]);

如果是SQLite:

$database = new medoo([

'database_type' => 'sqlite',

'database_file' => 'my/database/path/database.db'

]);

CURD

查询(Read):

select($table, $columns, $where) //获取所有记录

- table [string] 表名

- columns [string/array] 字段

- where (可选) [array] 查询条件

get($table, $columns, $where) //仅获取一条数据

select($table, $join, $columns, $where)

- table [string] 表名

- join [array] 关联查询,如果没有可以忽略

- columns [string/array] 字段

- where (可选) [array] 查询条件

示例:

$user = $db->select('user', '*'); //返回所有数据

$user = $db->get('user', '*'); //返回一条数据

$user = $db->select('user','*', array('name ' => 'joy'));

$user = $db->select('user','name', array('age[>] ' => 20));

$user = $db->select('user',['name','age'], array('age[<=] ' => 20));

新增(Create):

insert($table, $data)

示例:

$db->insert('user', array('name'=> 't3', 'age'=>22)); //返回自增id

注意:如果数据里面包含子数组将会被serialize()序列化, 你可以使用json_encode()作为JSON存储.

更新(Update):

update($table, $data, $where)

示例:

$db->update('user', array('name'=> 't5'), array('id'=> 23)); //返回受影响的行数

删除(Delete):

delete($table, $where)

示例:

$db->update('user', array('id'=> 23)); //返回受影响的行数

where

聚合查询

$db->has('user', array('id'=> 23)); //记录是否存在

$db->count('user', array('id[>]'=> 23)); //统计

$db->max('user', 'age', array('gender'=> 1)); //最大值

$db->min('user', 'age', array('gender'=> 2)); //最小值

$db->avg('user', 'age', array('gender'=> 2)); //平均值

$db->sum('user', 'age', array('gender'=> 2)); //求和

以上方法均支持第二个参数是$join,即关联查询。

事务机制

$db->action(function($db) {

try{

$db->insert("account", [

"name" => "foo",

"email" => "bar@abc.com"

]);

$db->delete("account", [

"user_id" => 2312

]);

}catch(Exception $e){

// 返回false就会回滚事务

return false;

}

});

使用query

可以直接使用SQL。

//查询

$data = $db->query("SELECT * FROM user")->fetchAll();

print_r($data);

//删除

$db->query("DELETE FROM user where name='t5' ");

直接使用PDO

Medoo是基于PDO的,所以可以直接调用PDO实例。

获取PDO实例:

$pdo = $db->pdo;

接下来,可以使用PDO对象的所有方法了。

1.PDO::beginTransaction — 启动一个事务

2.PDO::commit — 提交一个事务

3.PDO::__construct — 创建一个表示数据库连接的 PDO 实例

4.PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE

5.PDO::errorInfo — 获取错误信息

6.PDO::exec — 执行一条 SQL 语句,并返回受影响的行数

7.PDO::getAttribute — 取回一个数据库连接的属性

*8.PDO::getAvailableDrivers — 返回一个可用驱动的数组(了解即可)

*9.PDO::inTransaction — 检查是否在一个事务内(了解即可)

10.PDO::lastInsertId — 返回最后插入行的ID或序列值

11.PDO::prepare — 创建SQL的预处理,返回PDOStatement对象

12.PDO::query — 用于执行查询SQL语句,返回PDOStatement对象

13.PDO::quote — 为sql字串添加单引号

14.PDO::rollBack — 回滚一个事务

15.PDO::setAttribute — 设置属性

示例:

$stmt = $pdo->query('select * from user limit 2'); //返回一个PDOStatement对象

//$row = $stmt->fetch(); //从结果集中获取下一行,用于while循环

$rows = $stmt->fetchAll(); //获取所有

print_r($rows);

pdo事务:

$pdo->beginTransaction();//开启事务处理

try{

//PDO预处理以及执行语句...

$pdo->commit();//提交事务

}catch(PDOException $e){

$pdo->rollBack();//事务回滚

//相关错误处理

throw $e;

}

使用DEBUG

debug() 打印最终的SQL语句

在select、get、insert、update等方法前面加上debug()方法可以打印SQL语句,程序不会继续运行:

$user = $db->debug()->select('user', '*');

//SELECT "name","age" FROM "user" WHERE "age" <= 20

error() 返回最后一次操作的出错信息

$db->select('user3', '*');

var_dump($db->error());

log() 返回所有的SQL查询语句,不影响查询正常执行

$db->select('user', '*');

var_dump($db->log());

last_query() 和log()类似,但仅返回最后一条SQL查询语句,不影响查询正常执行

$db->select('user', '*');

var_dump($db->last_query());

Eloquent ORM

Eloquent ORM是Laravel框架使用的ORM。Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。

(未完待续。。。)

Laravel 数据库操作 Eloquent ORM

laravel 操作数据库一般都使用它的Eloquent ORM才操作 建立模型 <?php namespace App; use Illuminate\Database\Eloquent\Mo ...

Django进阶Model篇—数据库操作(ORM)

一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...

Laravel 学习笔记之数据库操作——Eloquent ORM

1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...

Laravel数据库操作 Eloquent ORM

模型首先在App目录下建立student的文件夹 里面放上 Student.php 且需要继承基类Model //允许批量赋值的字段// protected $fillable = ['name',' ...

golang学习笔记16 beego orm 数据库操作

golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

Django 2&period;0 学习&lpar;14&rpar;:Django ORM 数据库操作&lpar;上&rpar;

Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...

使用脚本与orm模型交互对数据库操作

场景:如不想启动服务在框架中查看数据库数据,同时使用ORM框架对数据库操作带来的好处 import os import sys #将脚本所在的工程添加到环境变量 sys.path.append('.. ...

Django 2&period;0 学习&lpar;16&rpar;:Django ORM 数据库操作&lpar;下&rpar;

Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...

Django【第5篇】:Django之ORM数据库操作

django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...

随机推荐

string&period;Format之你不知道的事

1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

第八篇、UITableView常用功能&lpar;左滑出现多个按钮,多选删除等&rpar;

1.左滑动出现多个按钮 /** * 只要实现了这个方法,左滑出现按钮的功能就有了 (一旦左滑出现了N个按钮,tableView就进入了编辑模式, tableView.editing = YES) */ ...

C&num; 中的委托和事件 转张子阳

引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

Intersect交集

Description 设计一个求集合交的算法:输入集合A与集合B,求集合A与B之交.集合中的元素为整数(可以用c语言中的int表示),且互不相同. Input 输入第一行为一个整数t(0

ZOJ2112 Dynamic Rankings

题意 Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings ...

前端工程构建工具之Yeoman

一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...

ubuntu16&period;04 caffe(GPU模式)安装

历时5天终于完成了,配置中出现了各种各样的Error,这里记录一下,希望能为正在安装的人提供一点帮助. 配置中主要参考博客:http://blog.csdn.net/yhaolpz/article/d ...

nodejs 不支持 typescript (&period;&period;&period;paramName&colon;any&lbrack;&rsqb;)剩余参数。变相支持方式。

node es6 变相实现支持ts的剩余参数实现方式 //.ts method assign(to: any, options?: AssignOptions, ...forms: any[]){} ...

HTTP协议状态码详解(HTTP Status Code)(转)

原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成 ...

5&period;18-笨办法学python-习题15(open等读取文件)

from sys import argv script,filename=argv #不要忘了script(相当于一个固定变量),filename(可变变量) txt=open(filename) # ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值