Swoft
Swoft是基于swoole协程的高性能PHP微服务框架,Swoft宗旨是打造一款简单、快速、高效的框架。项目开源地址:https://github.com/swoft-cloud/swoft
ORM
ORM用于实现面向对象编程语言里不同类型系统的数据之间的转换,ORM有多种设计模式,swoft采用的是data mapper,业务和实体分开,但是也实现了类似ActiveRecord的操作方式,其实都是同一个实现的。
数据库操作分为两种基础(ActiveRecord)和高级的(data mapper),基础的用于快速开发和常见的查询操作,高级的用于事务和一些复杂的业务查询。
查询器语法
方法 | 功能 |
---|---|
insert | 指定插入表 |
update | 指向更新的表 |
delete | 删除语句 |
select | 查询字段 |
selects | 查询多个字段 |
from | 指定删除和查询的表 |
innerJoin | 内连接 |
leftJoin | 左连接 |
rightJoin | 右连接 |
where | where条件语句 |
andWhere | where and 条件语句 |
openWhere | where 里面左括号 |
closeWhere | where 里面右括号 |
orWhere | where or 条件语句 |
whereIn | where in语句 |
whereNotIn | where not in 语句 |
whereBetween | where between and 语句 |
whereNotBetween | where not between and语句 |
having | having语句 |
andHaving | having and语句 |
orHaving | having or语句 |
havingIn | having in语句 |
havingNotIn | having not in语句 |
havingBetween | having between and语句 |
havingNotBetween | havin not between and 语句 |
openHaving | having括号开始语句 |
closeHaving | having括号结束语句 |
groupBy | group by语句 |
orderBy | order by语句 |
limit | limit语句 |
set | 设置更新值 |
setParameter | 设置参数 |
setParameters | 设置多个参数 |
getSql | 获取执行语句 |
实体定义
一个表和一个类是一一映射的,对类的操作相当于对表的操作,该类称为一个实体。实体定义规则如下:
- 必须使用@Entity注解标明这是一个实体
- 必须使用@Table命令指定映射的表名
- 必须使用@column指定表映射字段,没有定义的属性,不映射。
- 其中一个属性必须使用@Id注解标明主键
- 所有属性必须有getter和setter方法
- 属性默认值即是表字段默认值。
- 若需使用基础查询,必须基础Model类
/**
* 用户实体
*
* @Entity()
* @Table(name="user")
* @uses User
* @version 2017年08月23日
* @author stelin
* @copyright Copyright 2010-2016 Swoft software
* @license PHP Version 7.x {@link http://www.php.net/license/3_0.txt}
*/
class User extends Model
{
/**
* 主键ID
*
* @Id()
* @Column(name="id", type=Types::INT)
* @var int
*/
private $id;
/**
* 名称
*
* @Column(name="name", type=Types::STRING, length=20)
* @Required()
* @var string
*/
private $name;
/**
* 年龄
*
* @Column(name="age", type=Types::INT)
* @var int
*/
private $age = 0;
/**
* 性别
*
* @Column(name="sex", type="int")
* @Enum(value={1,0})
* @var int
*/
private $sex = 0;
/**
* 描述
*
* @Column(name="description", type="string")
* @var string
*/
private $desc = "";
//getter and setter methods
// ...
}
注解解析
目前只实现了几个注解,若需其它验证注解比如邮、URI、手机等,可自行实现。
@Column
此注解用于定义类属性和表字段的关系,如果没有使用,默认属性的名称对应表字段名称,定义的字段类型对应数据库字段类型。注解有三个参数可以使用
- name定义映射的数据库字段名称
- type定义映射的数据库字段类型
- length定义字符串最大长度
@Enum
此注解是枚举类型注解,定义该字段只能是枚举数组里面的其中一个值,使用如上demo
@Id
数据表映射主键ID
@Required
属性字段必须传值
基础查询
swoft提供一套基础查询,类ActiveRecord方法,方便快捷的实现数据库操作,但是实体必须继承Model类,且不能使用事务,如需使用事务,请使用高级查询。基础查询提供延迟收包和非延迟收包两种方式,非延迟收包一般用于并发使用。
新增
$user = new User();
$user->setName("stelin");
$user->setSex(1);
$user->setDesc("this my desc");
$user->setAge(mt_rand(1, 100));
// 直接返回结果
//$result = $user->save();
// 延迟操作
$dataResult = $user->save(true);
$deferResult = $dataResult->getResult();
删除
实体删除
$user = new User();
$user->setAge(126);
// 直接返回结果
// $result = $user->delete();
// 延迟操作
$defer = $user->delete(true);
$result = $defer->getResult();
ID删除
// 直接返回结果
// $result = User::deleteById(284);
// 延迟操作
$deferResult = User::deleteById(287, true);
$result = $deferResult->getResult();
IDS删除
// 直接返回结果
// $result = User::deleteByIds([291, 292]);
// 延迟操作
$deferResult = User::deleteByIds([288, 289], true);
$result = $deferResult->getResult();
更新
$query = User::findById(285);
/* @var User $user */
$user = $query->getResult(User::class);
$user->setName("upateNameUser2");
$user->setSex(0);
// 直接返回结果
$result = $user->update();
// 延迟操作
//$result = $user->update(true);
//$result = $result->getResult();
查询
实体查询
$user = new User();
$user->setSex(1);
$user->setAge(93);
$query = $user->find();
// 直接返回数组结果
// $result = $query->getResult();
// 直接返回User实体对象结果
/* @var User $userResult */
// $userResult = $query->getResult(User::class);
// 延迟操作处理
$defer = $query->getDefer();
// $result = $defer->getResult();
$result = $defer->getResult(User::class);
// sql语句
$ql = $query->getSql();
var_dump($result);
ID查询
$query = User::findById(236);
// 直接返回数组结果
$result = $query->getResult();
// 直接返回User实体对象结果
/* @var User $userObject */
$userObject = $query->getResult(User::class);
$query = User::findById(238);
// 延迟操作处理
//$deferResult = $query->getDefer()->getResult();
/* @var User $deferResult */
$deferResult = $query->getDefer()->getResult(User::class);
IDS查询
$query = User::findByIds([416, 417]);
$sql = $query->getSql();
// 延迟操作处理
// $defer = $query->getDefer();
// $result = $defer->getResult(User::class);
// 直接返回数组结果
$result = $query->getResult();
查询器
// $query = User::query()->select('*')->andWhere('sex', 1)->orderBy('id',QueryBuilder::ORDER_BY_DESC)->limit(3);
//$query = User::query()->selects(['id', 'sex' => 'sex2'])->andWhere('sex', 1)->orderBy('id',QueryBuilder::ORDER_BY_DESC)->limit(3);
$query = User::query()->selects(['id', 'sex' => 'sex2'])->leftJoin(Count::class, 'count.uid=user.id')->andWhere('id', 416)
->orderBy('user.id', QueryBuilder::ORDER_BY_DESC)->limit(2);
// 延迟操作处理
// $result = $query->getResult();
// 直接返回数组结果
$defer = $query->getDefer();
$result = $defer->getResult();
并发查询
// getDefer方法延迟收包结果
$query1 = User::query()->selects(['id', 'sex' => 'sex2'])->leftJoin(Count::class, 'count.uid=user.id')->andWhere('id', 419)
->orderBy('user.id', QueryBuilder::ORDER_BY_DESC)->limit(2)->getDefer();
// getDefer方法延迟收包结果
$query2 = User::query()->select("*")->leftJoin(Count::class, 'count.uid=user.id')->andWhere('id', 420)
->orderBy('user.id', QueryBuilder::ORDER_BY_DESC)->limit(2)->getDefer();
// 同时接受数据
$result1 = $query1->getResult();
$result2 = $query2->getResult();
高级查询
高级查询可以事务事务和执行原生SQL语句,同一个实体管理器使用同一个数据库连接。使用基本上基础的查询差不多。
EntityManager::create()创建一个实体管理,默认是从节点,不存在从节点,使用主节点
实体管理器使用完,一定要关闭,否则无法释放连接
新增
$user = new User();
$user->setName("stelin");
$user->setSex(1);
$user->setDesc("this my desc");
$user->setAge(mt_rand(1, 100));
$em = EntityManager::create(true);
// $result = $em->save($user);
$defer = $em->save($user, true);
$result = $defer->getResult();
$em->close();
删除
实体删除
$user = new User();
$user->setId(418);
$em = EntityManager::create(true);
// $result = $em->delete($user);
$result = $em->delete($user, true);
$em->close();
ID删除
$em = EntityManager::create(true);
// $result = $em->deleteById(Count::class, 396);
$result = $em->deleteById(Count::class, 406, true);
$em->close();
IDS删除
$em = EntityManager::create(true);
// $result = $em->deleteByIds(Count::class, [409, 410]);
$result = $em->deleteByIds(Count::class, [411, 412], true);
$em->close();
更新
// 更是操作略有不同
$em = EntityManager::create();
$query = $em->createQuery()->update(User::class)->set('name', 'new name')->set('age', 12)->where('id', 12);
$result = $query->getResult();
$em->close();
查询
实体查询
$user = new User();
$user->setSex(1);
$em = EntityManager::create();
$query = $em->find($user);
// $result = $query->getResult();
// $result = $query->getResult(User::class);
// $result = $query->getDefer()->getResult();
$result = $query->getDefer()->getResult(User::class);
$sql = $query->getSql();
$em->close();
ID查询
$em = EntityManager::create();
$query = $em->findById(User::class, 396);
// $result = $query->getResult();
// $result = $query->getResult(User::class);
$result = $query->getDefer()->getResult();
$sql = $query->getSql();
$em->close();
IDS查询
$query = User::findByIds([416, 417]);
$sql = $query->getSql();
// $defer = $query->getDefer();
// $result = $defer->getResult(User::class);
$result = $query->getResult();
查询器
// 查询器查询
$em = EntityManager::create();
$query = $em->createQuery();
$query->select("*")->from(User::class, 'u')->leftJoin(Count::class, ['u.id=c.uid'], 'c')->whereIn('u.id', [419, 420, 421])
->orderBy('u.id', QueryBuilder::ORDER_BY_DESC)->limit(2);
// $result = $query->getResult();
$result = $query->getDefer()->getResult();
$sql = $query->getSql();
$em->close();
// sql查询
$params = [
['uid', 419],
['uid2', 420],
['uid3', 421, Types::INT],
];
$em = EntityManager::create();
// ':'方式传递参数
$querySql = "SELECT * FROM user AS u LEFT JOIN count AS c ON u.id=c.uid WHERE u.id IN (:uid, :uid1, :uid3) ORDER BY u.id DESC LIMIT 2";
$query = $em->createQuery($querySql);
// 单个设置参数
// $query->setParameter('uid', 419);
// $query->setParameter('uid2', 420);
// $query->setParameter('uid3', 421);
// 数组方式指定参数
$query->setParameters($params);
// '?'方式传递参数
// $querySql = "SELECT * FROM user AS u LEFT JOIN count AS c ON u.id=c.uid WHERE u.id IN (?1, ?2, ?3) ORDER BY u.id DESC LIMIT 2";
// $query = $em->createQuery($querySql);
// $query->setParameter(1, 419);
// $query->setParameter(2, 420);
// $query->setParameter(3, 421);
$result = $query->getResult();
$sql = $query->getSql();
$em->close();
事务
$user = new User();
$user->setName("stelin");
$user->setSex(1);
$user->setDesc("this my desc");
$user->setAge(mt_rand(1, 100));
$count = new Count();
$count->setFans(mt_rand(1, 1000));
$count->setFollows(mt_rand(1, 1000));
$em = EntityManager::create();
$em->beginTransaction();
$uid = $em->save($user);
$count->setUid($uid);
$result = $em->save($count);
if ($result === false) {
$em->rollback();
} else {
$em->commit();
}
$em->close();