thoth-pharaoh / base-model-repository
提供基础抽象类供项目使用
v2.0.2
2023-02-24 11:35 UTC
Requires
- php: ^8.0
- illuminate/support: >=9.0
Requires (Dev)
- orchestra/testbench: ^7.0
README
版本匹配
AbstractBaseModel
使用方法
namespace App\Models; use Pharaoh\BaseModelRepository\Models\AbstractBaseModel; class Blog extends AbstractBaseModel { }
功能
- 自动加载 HasFactory 特性
- 自动设置 $guard = ['id']
- 自动序列化 DateTime 格式
Y-m-d H:i:s
AbstractBaseRepository
使用方法
namespace App\Repositories; use App\Models\Blog; use Pharaoh\BaseModelRepository\Repositories\AbstractBaseRepository; class BlogRepository extends AbstractBaseRepository { public function __construct(Blog $blog) { $this->model = $blog; $this->table = $this->model->getTable(); } }
获取所有数据
$repository->getAll($fields, $eagerLoad);
根据搜索条件获取数据(whereIn)
$repository->getByWhereIn($whereField, $whereValue, $field, $eagerLoad);
获取单条数据
$repository->find($id, $eagerLoad);
获取单条数据(单一搜索条件)
$repository->findByWhere($where, $field, $eagerLoad);
完整示例
$repository->findByWhere([ ['status', '=', '1'], ['subscribed', '<>', '1'], ]);
或
$repository->findByWhere([ ['status' => '1'], ['subscribed' => '1'], ]);
获取单条数据 从写入数据库获取
$repository->findWriteConnect($id);
获取单条数据 从写入数据库获取 并加排他锁
$repository->findWriteConnectByLockForUpdate($id);
查找某个字段有重复值及其数量
$repository->findDuplicateValue($field, $where, $extraParameters, $havingCount)
完整示例
$repository->findDuplicateValue('member_id', [ ['start_at', '>', '2022-01-10 00:00:00'], ['end_at', '<', '2022-01-10 23:59:59'], ['status', '=', 'OK'] ], 1)
新增数据
$repository->store($parametes)
完整示例
$repository->store([ 'name' => 'nick', 'age' => 20 ])
新增多条数据
$repository->insertMuti($parametes)
完整示例
$repository->insertMuti([ [ 'name' => 'nick', 'age' => 20, ], [ 'name' => 'john', 'age' => 20 ] ])
更新单条数据
$repository->update($id, $parameters)
完整示例
$repository->update($id, [ 'name' => 'jack', 'age' => 19 ])
根据指定字段更新单条信息
$repository->updateByWhere($where, $parameters)
完整示例
$repository->updateByWhere( [ 'status' => 3, 'type' => 1, ], [ 'status' => 1, 'updated_at' => now() ] )
更新多条数据
$repository->updateMuti($data, $parameters, $field)
完整示例
$repository->updateMuti( [1, 2, 3], [ 'status' => 1, 'updated_at' => now() ], 'id' )
数据新增,存在则更新
$repository->updateOrInsert($where, $parameters)
完整示例
$repository->updateOrInsert( [ 'email' => 'john@example.com', 'name' => 'John' ], [ 'phone' => '0994930918' ] )
批量更新或新增数据
$repository->updateOrCreateMulti($parameters)
完整示例
$repository->updateOrCreateMulti( [ 'email' => 'john@example.com', 'name' => 'John', 'phone' => '0994930918' ], [ 'email' => 'jack@example.com', 'name' => 'jack', 'phone' => '0994930920' ] )
一次性更新多条数据
$repository->updateMultiRows($setField, $caseField, $setValue)
完整示例
$repository->updateMultiRows( 'score', 'id', [ 1 => 90, 2 => 80, 3 => 70 ] )
增加数量
$repository->increment($where, $field, $num)
完整示例
$repository->increment( ['name' => 'john'], 'amount', 10 )
减少数量
$repository->decrement($where, $field, $num)
完整示例
$repository->decrement( ['name' => 'john'], 'amount', 5 )
根据条件删除数据
$repository->deleteByWhere($where);
完整示例
$repository->deleteByWhere([ ['name' => 'john'], ['age' => 20] ]);
AbstractBaseScope
使用方法
- scope 类需要继承 AbstractBaseScope
namespace App\Scopes; use Pharaoh\BaseModelRepository\Models\AbstractBaseScope; class OrderScope extends AbstractBaseScope { }
- 初始化 $extensions
protected array $extensions = [ 'Date', ... ];
- 实现过滤条件方法 (名称为$extensions中,元素名称前面 + 'add', ex: 'Date' => 'addDate')
使用 $builder->macro 去建立方法内容
use Illuminate\Database\Eloquent\Builder; /** * 篩選 交易時間 * * @param Builder $builder */ protected function addDate(Builder $builder) { $builder->macro('date', function (Builder $builder, array $params) { // 實作過濾條件的內容部分 $date = Arr::get($params, 'date'); return $builder->where('date', $date); }); }
- 在 Model 中需加入该 global scope
use App\Scopes\OrderScope; /** * The "booted" method of the model. */ protected static function booted() { static::addGlobalScope(new OrderScope); }
- 在 Repository 中需注册 scope
$builder = $this->scopeQuery($scope, $params, $model)
完整示例
$builder = $this->scopeQuery(OrderScope::class, ['date' => '2022-01-10']) ->select('*')
辅助工具
使用方法
dd_sql
输出并显示整个原始 SQL 语句
示例
dd_sql((User::select('id', 'name')->where('sex', 1)->orderBy('id'))
输出结果
select `id`, `name` from `users` where `sex` = 1 order by `id` asc
dump_sql
输出整个原始 SQL 语句
示例
dump_sql((User::select('id', 'name')->where('sex', 1)->orderBy('id'))
输出结果
select `id`, `name` from `users` where `sex` = 1 order by `id` asc