Skip to content
liaofei edited this page Jan 20, 2021 · 1 revision

Dao

  • Dao定义

目录位于

\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介绍

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');
Clone this wiki locally