欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。由于本站位于香港虚拟主机,故速度比较慢。

文摘  Swoole微服务框架Swoft之ORM

PHP框架 网络 159 0评论

Swoft

Swoft是基于swoole协程的高性能PHP微服务框架,Swoft宗旨是打造一款简单、快速、高效的框架。项目开源地址:https://github.com/swoft-cloud/swoft 

关于swoft框架的入门请参考文章:http://ittxx.cn/view/203 


ORM

ORM用于实现面向对象编程语言里不同类型系统的数据之间的转换,ORM有多种设计模式,swoft采用的是data mapper,业务和实体分开,但是也实现了类似ActiveRecord的操作方式,其实都是同一个实现的。


数据库操作分为两种基础(ActiveRecord)和高级的(data mapper),基础的用于快速开发和常见的查询操作,高级的用于事务和一些复杂的业务查询。


查询器语法

方法功能
insert指定插入表
update指向更新的表
delete删除语句
select查询字段
selects查询多个字段
from指定删除和查询的表
innerJoin内连接
leftJoin左连接
rightJoin右连接
wherewhere条件语句
andWherewhere and 条件语句
openWherewhere 里面左括号
closeWherewhere 里面右括号
orWherewhere or 条件语句
whereInwhere in语句
whereNotInwhere not in 语句
whereBetweenwhere between and 语句
whereNotBetweenwhere not between and语句
havinghaving语句
andHavinghaving and语句
orHavinghaving or语句
havingInhaving in语句
havingNotInhaving not in语句
havingBetweenhaving between and语句
havingNotBetweenhavin not between and 语句
openHavinghaving括号开始语句
closeHavinghaving括号结束语句
groupBygroup by语句
orderByorder by语句
limitlimit语句
set设置更新值
setParameter设置参数
setParameters设置多个参数
getSql获取执行语句


实体定义

一个表和一个类是一一映射的,对类的操作相当于对表的操作,该类称为一个实体。实体定义规则如下:

· 必须使用@Entity注解标明这是一个实体

· 必须使用@Table命令指定映射的表名

· 必须使用@column指定表映射字段,没有定义的属性,不映射。

· 其中一个属性必须使用@Id注解标明主键

· 所有属性必须有getter和setter方法

· 属性默认值即是表字段默认值。

· 若需使用基础查询,必须基础Model类


/**
 * 用户实体
 *
 * @Entity()
 * @Table(name="user")
 * @uses      User
 * @version   2017年08月23日
 * @author    stelin <phpcrazy@126.com>
 * @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

属性字段必须传值


1.基础查询


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();


2.高级查询


高级查询可以事务事务和执行原生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();


原文地址:https://blog.csdn.net/aa19891204/article/details/81225389

转载请注明: ITTXX.CN--分享互联网 » Swoole微服务框架Swoft之ORM

最后更新:2018-12-17 18:26:24

赞 (0) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽