laravel-repository
提供了基础的 repository
类, 对laravel 的
model 进行了的封装,提供更
多的对外的方法,以及更友好的编辑器提示;对代码进行了的分层,repository
负责对外的业务逻辑处理,
model
只负责对数据表的字段、属性、查询条件、返回值的定义,不参与具体的逻辑运算,不对控制层服务
- 解决
model
在新增、修改时不自动处理多余字段问题 - 优化
model
查询时的链式调用,直接使用数组的方式进行查询 - 通过查询条件和查询字段,自动处理对应的关联数据查询
- 提供了更友好的编辑器提示
- PHP >= 7.0.0
- Laravel >= 5.5.0
composer require littlebug/laravel-repository:2.0.*
或者在你的项目 composer.json 文件中添加:
"littlebug/laravel-repository": "2.0.*"
然后执行 composer update
假设你的数据库中存在 users, 或者你将 users 替换为你数据库中的表名称
php artisan core:model --table=users --name=User
该命令会在:
app/Models/
文件下生成User
文件app/Repositories/
文件下生成UserRepository
文件
<?php
use Illuminate\Routing\Controller;
use Littlebug\Repository\Tests\Stubs\UserRepository;
class UsersController extends Controller
{
/**
* @var UserRepository
*/
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function index()
{
// 分页查询、返回分页对象
$paginate = $this->userRepository->paginate([
'name:like' => 'test',
'status' => [1, 2], // 自动转换为 in 查询
// 添加复杂查询,生成SQL如: ("users"."status" = ? or "users"."age" >= ? or ("users"."status" = ? and "users"."age" != ?))
// 更多使用说明:https://wanchaochao.github.io/laravel-repository/?page=repository#5.3-%E9%A2%84%E5%AE%9A%E4%B9%89%E5%AD%97%E6%AE%B5%E6%9F%A5%E8%AF%A2
'or' => [
'status' => 1,
'age:gte' => 26,
'and' => [
'status' => 1,
'age:neq' => 24,
],
],
], [
'user_id',
'username',
// 关联统计字段查询, 前提是model 定义了关联 posts() 方法。 相当于 withCount
'posts_count',
// 关联表字段查询,前提是model 定义了关联 ext() 方法。相当于 with
'ext' => [
'user_id',
'ext_avatar',
],
]);
return view('users.index', compact('paginate'));
}
public function create()
{
// 添加数据、返回 model->toArray()
$user = $this->userRepository->create(request()->all());
dump($user);
}
public function update()
{
// 修改数据、返回受影响的行数
$row = $this->userRepository->update(request()->input('id'), request()->all());
dump($row);
}
public function delete()
{
// 删除数据、返回受影响的行数
$row = $this->userRepository->delete(request()->input('id'));
dump($row);
}
}
如果不想使用注入对象的方式调用的话,可以直接使用 Repository
对象静态方法 instance()
调用, 如下:
use Littlebug\Repository\Tests\Stubs\UserRepository;
// 分页查询
$paginate = UserRepository::instance()->paginate(['status' => 1]);
// 查询一条数据
$user = UserRepository::instance()->find(['status' => 1, 'id:gt' => 2]);
方法名称 | 返回值 | 说明 |
---|---|---|
find($conditions, $columns = ['*']) |
null|array |
查询一条数据 |
findBy($conditions, $column) |
null|mixed |
查询一条数据的单个字段 |
findAll($conditions, $columns = ['*]) |
array |
查询多条数据 |
findAllBy($conditions, $column) |
array |
查询多条数据的单个字段数组 |
first($conditions, $column) |
null|model |
检索对象 |
get($conditions, $column) |
Collection |
检索集合 |
方法名称 | 返回值 | 说明 |
---|---|---|
count($conditions, $column = '*') |
int |
统计数量 |
max($conditions, $column) |
mixed |
最大值 |
min($conditions, $column) |
mixed |
最小值 |
avg($conditions, $column) |
mixed |
平均值 |
sum($conditions, $column) |
mixed |
求和 |
方法名称 | 返回值 | 说明 |
---|---|---|
increment($conditions, $column, $amount = 1, $extra = []) |
int |
递增 |
decrement($conditions, $column, $amount = 1, $extra = []) |
int |
递减 |
firstOrCreate(array $attributes, array $value = []) |
model |
检索对象不存在创建 |
updateOrCreate(array $attributes, array $value = []) |
model |
修改数据不存在创建 |
如果需要指定数据库连接的名称,只需要在表名称前面添加数据库连接名称.就好 例如: --table=dev.users
-
core:model
生成model
类文件和repository
类文件php artisan core:model --table=users --name=User
-
core:repository
单独生成repository
类文件php artisan core:repository --model=User --name=UserRepository
-
core:request
生成request
验证类文件,会通过表结构信息生成对应的验证php artisan core:request --table=users --path=Users