thoth-pharaoh/base-model-repository

提供基础抽象类供项目使用

v2.0.2 2023-02-24 11:35 UTC

This package is auto-updated.

Last update: 2024-09-24 15:40:39 UTC


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