-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Dao
liaofei edited this page Jan 20, 2021
·
1 revision
\app\dao
具体dao下在分块,根据具体逻辑功能不同划分
dao位于数据模型model层与逻辑处理层services之间,处理每个特定逻辑数据库操作或有共性的查询、操作等
每一个dao对应一个model,比如在\app\model下存在User模型,那么在\app\dao下必然存在一个UserDao,必需继承baseDao并实现setModel方法,关联一个model类
protected function setModel(): string
{
return User::class;
}
一个dao操作一个model类,model也只能通过这个dao被使用,不允许跨dao调用以及夸层级调用model
完整定义一个dao
<?php
declare (strict_types=1);
namespace app\dao\user;
use app\dao\BaseDao;
use app\model\user\User;
/**
* 用户
* Class UserDao
* @package app\dao\user
*/
class UserDao extends BaseDao
{
protected function setModel(): string
{
return User::class;
}
//公共查询列表
public function getList(array $where, string $field = '*', int $page = 0, int $limit = 10): array
{
return $this->search($where)->field($field)->with(['label'])->page($page, $limit)->select()->toArray();
}
}
实现复杂连表操作,比如User与Label,需要在dao定义命名规范为:主表链接表Dao的类,比如:UserLabelDao.php
这个dao中需要实现,setModel(主表模型)、joinModel(连接表模型)、以及重写获取模型getModel方法
public function getModel(string $alias = 'u', string $join_alias = 'l', $join = 'left')
{
$this->alias = $alias;
$this->join_alis = $join_alias;
/** @var Label $label */
$label = app()->make($this->joinModel());
$table = $label->getName();
return parent::getModel()::alias($alias)->join($table . ' ' . $join_alias, $alias . '.uid = ' . $join_alias . '.uid', $join);
}
完整dao如下
<?php
declare (strict_types=1);
namespace app\dao\user;
use think\model;
use app\dao\BaseDao;
use app\model\user\User;
use app\model\wechat\WechatUser;
/**
*
* Class UserWechatUserDao
* @package app\dao\user
*/
class UserWechatUserDao extends BaseDao
{
/**
* @var string
*/
protected $alias = '';
/**
* @var string
*/
protected $join_alis = '';
/**
* 设置模型
* @return string
*/
protected function setModel(): string
{
return User::class;
}
public function joinModel(): string
{
return WechatUser::class;
}
/**
* 关联模型
* @param string $alias
* @param string $join_alias
* @return \crmeb\basic\BaseModel
*/
public function getModel(string $alias = 'u', string $join_alias = 'w', $join = 'left')
{
$this->alias = $alias;
$this->join_alis = $join_alias;
/** @var WechatUser $wechcatUser */
$wechcatUser = app()->make($this->joinModel());
$table = $wechcatUser->getName();
return parent::getModel()::alias($alias)->join($table . ' ' . $join_alias, $alias . '.uid = ' . $join_alias . '.uid', $join);
}
}
services->dao->model 都是单一对应 dao必需在对应的services中调用,不能被其他services或者dao调用 比如:UserDao 必然只能被UserServices 使用 services中注入对应dao
/**
* UserServices constructor.
* @param UserDao $dao
*/
public function __construct(UserDao $dao)
{
$this->dao = $dao;
}
在services中使用
$this->dao
就可以直接调用dao中定义的查询或者增删改差逻辑,比如:
$this->dao->getList(['is_del'=>0]);
services完整使用:
/**
* 获取用户列表
* @param array $where
* @param string $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getUserList(array $where, string $field): array
{
return $this->dao->getList($where, $field, $page, $limit);
}
baseDao中内置了一些常用查询、聚合、添加、修改方法,如下:
- @ get(int $id, ?array $field = []) 获取一条数据(主键)
返回
find()
查询结果集对象 - @ getOne(array $where, ?string $field = '*') 获取一条数据(多条件)
返回
find()
查询结果集对象 - @ batchUpdate(array $ids, array $data, ?string $key = null) 批量修改
返回
update()
结果,影响数据条数 - @ sum(array $where, string $field, bool $search = false) 求和
返回
sum()
集合查询总数 - @ update($id, array $data, ?string $field) 修改数据
返回
update()
结果,影响数据条数 - @ be($map, string $field = '') 查询一条数据是否存在
返回
true|false
- @ value(array $where, string $field) 获取指定条件下的数据 返回具体字段值
- @ count(array $where = []) 读取数据条数
返回
count()
统计条数 - @ getCount(array $where = []) 获取某些条件总数(复杂条件嵌套,可以是二位数组)
返回
count()
统计条数 - @ getColumn(array $where, string $field, string $key = '') 获取某个字段数组 返回查询字段的二位数组
- @ delete($id, ?string $key = null) 删除
返回
delete()
结果 - @ save(array $data) 保存数据
返回
create()
结果,当前模型对象实例 - @ saveAll(array $data) 批量保存数据
返回
insertAll()
结果,添加数据条数 - @ bcInc($key, string $incField, string $inc, string $keyField = null, int $acc = 2) 高精度加法
返回
save()
结果,true|false
- @ bcDec($key, string $decField, string $dec, string $keyField = null, int $acc = 2) 高精度 减法
返回
save()
结果,true|false
- @ decStockIncSales(array $where, int $num, string $stock = 'stock', string $sales = 'sales') 减库存加销量
返回
update()
结果,影响数据条数 - @ incStockDecSales(array $where, int $num, string $stock = 'stock', string $sales = 'sales') 加库存减销量
返回
update()
结果,影响数据条数
可以在baseServices引入\crmeb\traits\ServicesTrait
类,并 use ServicesTrait
,就可以使用baseDao中内置的方法了
例如:
$userServices = app()->make('UserServices');
//get使用
$user = $userServices->get(1);
//getOne使用
$use = $userServices->getOne(['id'=>1,'is_del'=>0]);
//update使用
$use = $userServices->update(1,['nickanme'=>'张三'],'uid');
//save使用
$res = $userServices->save($data);
$uid = $res->uid;
//getColumn使用
$user = $userServices->getColumn(['spread_uid'=>1],'uid,name','uid');