BaseRepository.php 5.37 KB
Newer Older
王源's avatar
王源 committed
1 2 3 4 5 6 7 8 9 10 11
<?php

/**
 * Created by PhpStorm.
 * User: zero
 * Date: 2020/2/7
 * Time: 13:47
 */

namespace Meibuyu\Micro\Repository\Eloquent;

王源's avatar
王源 committed
12
use Hyperf\Database\Exception\QueryException;
王源's avatar
王源 committed
13
use Hyperf\Database\Model\Builder;
王源's avatar
王源 committed
14
use Hyperf\DbConnection\Model\Model;
王源's avatar
王源 committed
15
use Hyperf\HttpServer\Contract\RequestInterface;
王源's avatar
王源 committed
16 17
use Meibuyu\Micro\Exceptions\HttpResponseException;
use Meibuyu\Micro\Exceptions\RepositoryException;
18
use Meibuyu\Micro\Exceptions\ValidatorException;
王源's avatar
王源 committed
19 20 21 22 23 24 25 26 27 28 29
use Meibuyu\Micro\Repository\Contracts\RepositoryInterface;
use Meibuyu\Micro\Validator\Contracts\ValidatorInterface;
use Psr\Container\ContainerInterface;

abstract class BaseRepository implements RepositoryInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

王源's avatar
王源 committed
30 31 32 33 34
    /**
     * @var RequestInterface
     */
    protected $request;

王源's avatar
王源 committed
35
    /**
王源's avatar
王源 committed
36
     * @var Model|Builder
王源's avatar
王源 committed
37 38 39 40 41 42 43 44 45 46 47
     */
    protected $model;

    /**
     * @var ValidatorInterface
     */
    protected $validator;

    /**
     * BaseRepository constructor.
     * @param ContainerInterface $container
王源's avatar
王源 committed
48
     * @param RequestInterface $request
王源's avatar
王源 committed
49 50
     * @throws RepositoryException
     */
王源's avatar
王源 committed
51
    public function __construct(ContainerInterface $container, RequestInterface $request)
王源's avatar
王源 committed
52 53
    {
        $this->container = $container;
王源's avatar
王源 committed
54
        $this->request = $request;
王源's avatar
王源 committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
        $this->makeModel();
        $this->makeValidator();
    }

    /**
     * Specify Model class name
     * @return mixed
     */
    abstract public function model();

    /**
     * Specify Validator class name
     * @return null|mixed
     */
    public function validator()
    {
        return null;
    }

    /**
     * @return Model
     * @throws RepositoryException
     */
    public function makeModel()
    {
        $model = $this->container->make($this->model());
        if (!$model instanceof Model) {
            throw new RepositoryException("Class {$this->model()} must be an instance of Hyperf\\DbConnection\\Model\\Model");
        }
        return $this->model = $model;
    }

    /**
     * @param null $validator
     *
     * @return null|ValidatorInterface
     * @throws RepositoryException
     */
    public function makeValidator($validator = null)
    {
        $validator = !is_null($validator) ? $validator : $this->validator();

        if (!is_null($validator)) {
            $this->validator = $this->container->make($validator);

            if (!$this->validator instanceof ValidatorInterface) {
                throw new RepositoryException("Class {$validator} must be an instance of Meibuyu\\Micro\\Validator\\Contracts\\ValidatorInterface");
            }

            return $this->validator;
        }

        return null;
    }

    /**
     * @param $id
     * @param array $columns
王源's avatar
王源 committed
113
     * @return mixed|Model
王源's avatar
王源 committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
     * @throws HttpResponseException
     */
    public function find($id, $columns = ['*'])
    {
        $model = $this->model->find($id, $columns);
        if (!$model) {
            throw new HttpResponseException('数据不存在');
        }
        return $model;
    }

    /**
     * @param array $columns
     * @return mixed
     */
    public function all($columns = ['*'])
    {
        return $this->model->get($columns);
    }

王源's avatar
王源 committed
134 135
    public function list()
    {
王源's avatar
王源 committed
136
        return $this->all();
王源's avatar
王源 committed
137 138
    }

王源's avatar
王源 committed
139 140 141 142 143
    /**
     * @param $id
     * @return Model|mixed
     * @throws HttpResponseException
     */
王源's avatar
王源 committed
144
    public function show($id)
145
    {
王源's avatar
王源 committed
146
        return $this->find($id);
147 148
    }

王源's avatar
王源 committed
149 150 151 152 153
    public function paginate($perPage = 10, $columns = ['*'])
    {
        return $this->model->paginate($perPage, $columns);
    }

154 155 156 157 158
    /**
     * @param array $attributes
     * @return Model
     * @throws ValidatorException
     */
王源's avatar
王源 committed
159 160
    public function create(array $attributes)
    {
161 162 163 164
        if (!is_null($this->validator)) {
            $this->validator->with($attributes)->passesOrFail(ValidatorInterface::RULE_CREATE);
        }

王源's avatar
王源 committed
165 166 167 168 169
        $model = $this->model->newInstance($attributes);
        $model->save();
        return $model;
    }

170 171 172 173
    /**
     * @param array $attributes
     * @param $id
     * @return Model | mixed
王源's avatar
王源 committed
174
     * @throws HttpResponseException
175 176
     * @throws ValidatorException
     */
王源's avatar
王源 committed
177 178
    public function update(array $attributes, $id)
    {
179 180 181 182
        if (!is_null($this->validator)) {
            $this->validator->with($attributes)->setId($id)->passesOrFail(ValidatorInterface::RULE_UPDATE);
        }

王源's avatar
王源 committed
183
        $model = $this->find($id);
王源's avatar
王源 committed
184 185 186 187 188 189 190
        $model->fill($attributes);
        $model->save();
        return $model;
    }

    /**
     * @param $id
191 192
     * @return bool|mixed
     * @throws HttpResponseException
王源's avatar
王源 committed
193 194 195 196
     */
    public function delete($id)
    {
        $model = $this->find($id);
王源's avatar
王源 committed
197 198
        try {
            $delete = $model->delete();
王源's avatar
王源 committed
199 200 201 202 203 204 205
        } catch (QueryException $e) {
            $msg = $e->getMessage();
            if ($e->getCode() == 23000 && strpos($msg, 'foreign key') !== false) {
                throw new HttpResponseException('此数据下有关联的数据,不可进行操作');
            } else {
                throw new HttpResponseException($msg);
            }
王源's avatar
王源 committed
206 207 208
        } catch (\Exception $e) {
            throw new HttpResponseException($e->getMessage());
        }
209 210 211 212 213
        if ($delete !== false) {
            return $delete;
        } else {
            throw new HttpResponseException('删除失败,请刷新重试');
        }
王源's avatar
王源 committed
214 215 216 217 218 219 220 221
    }

    public function findBy($field, $value, $columns = ['*'])
    {
        return $this->model->where($field, '=', $value)->first($columns);
    }

}