重複造輪子了, 自己開發的 Laravel Repository

根據公司的項目的repository,優化並去除公司的業務代碼(繼承思路,代碼重構),然後和同事一起將repository開源出來

GitHub地址

一 安裝使用

安裝包文件

composer require littlebug/laravel-repository

生成 model 和 repository

littlebug/laravel-repository 提供了命令行模式生成modelrepository
使用命令

php artisan core:model --table=users --name=User

該命令會在:

  • app/Models/ 文件下生成 User 文件
  • app/Repositories/ 文件下生成 UserRepository 文件

在控制器中使用repository

use App\Repositories\UserRepository;

class UsersController extends Controller 
{
    /**
     * @var UserRepository
     */
    private $userRepository;
    
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
    
    public function index()
    {
        // 分頁查詢
        $list = $this->userRepository->paginate([
            'name:like' => 'test123', 
            'status:in' => [1, 2],
        ]);
        
        return view('users.index', compact('list'));
    }
    
    public function create()
    {
        list($ok, $msg, $user) = $this->userRepository->create(request()->all());
        // 你的邏輯
    }
    
    public function update()
    {
        list($ok, $msg, $row) = $this->userRepository->update(request()->input('id'), request()->all());
        // 你的邏輯
    }
    
    public function delete()
    {
        list($ok, $msg, $row) = $this->userRepository->delete(request()->input('id'));
        // 你的邏輯
    }
}

二 支持的方法列表

repository所有方法都是對外的,這裏只列出常用方法

  • find($conditions, $columns = []) 查詢一條數據
  • findBy($conditions, $column) 查詢單條數據的單個字段
  • findAll($conditions, $columns = []) 查詢多條數據
  • findAllBy($conditions, $column) 查詢多條數組的單個字段數組
  • filterFind($conditions, $columns = []) 過濾查詢條件中的空值查詢一條數據
  • filterFindAll($condtions, $columns = []) 過濾查詢條件中的空值查詢多條數據
  • paginate($conditions = [], $columns = [], $size = 10, $current = null) 分頁查詢數據
  • getFilterModel($conditions, $columns = []) 獲取已經過濾處理查詢條件的model
  • findCondition($conditions = [], $columns = []) 獲取已經處理查詢條件的model(上面所有查詢方法都基於這個方法)
  • create(array $data) 添加數據
  • update($conditions, array $data) 修改數據(使用的是批量修改)
  • delete($conditions) 刪除數據(使用的是批量刪除)

參數說明

參數名稱 參數類型 參數說明
$conditions array or string or int 查詢條件(string or int or 索引數組[1, 2, 3, 4]會自動轉換爲主鍵查詢)
$columns array 查詢的字段數組
$column string 查詢的字段名稱
$data array 創建或者修改的數組數據信息

更多方法GitHub傳送門>>

三 特性說明

1 表達式查詢

支持的表達式列表
model where 寫法

$users = User::where('type', '=', 1)
			->whereIn('status', [1, 2])
			->where('username', 'like', '%test%')
			->whereBetween('created_at', ['2019-01-02 00:00:00', '2019-05-01 23:59:59'])
			->orderBy('id', 'desc')
			->get()

使用 repository 查詢

$users = $this->userRepository->findAll([
	'type' => 1,
	'status' => [1, 2], // 數組會轉爲 in 查詢,
	'username:like' => '%test%',
	'created_at:between' => ['2019-01-02 00:00:00', '2019-05-01 23:59:59'],
	'order' => 'id desc', // order 定義排序方式 
]);

2 支持scope查詢

model 需要定義scope 方法

public function scopeAddress($query, $address)
{
	return $query->join('user_ext', 'users.user_id', '=', 'uesr_ext.user_id')->where('address', 'like', "%{$address}%");
}

model 寫法

$users = User::Address('北京')->get();

repository 寫法

$users = $this->userRepository->findAll(['address' => '北京']);

3 關聯查詢

model 需要定義關聯

public function ext()
{
	return $this->hasOne(UserExt::class, 'user_id', 'user_id');
}

model 寫法

$users = User::with(['ext' => function ($query) {
	return $query->select(['id', 'name'])
	->where('address', 'like', '%北京%')
	->orderBy('id', 'desc');
}])->get()

repository 寫法

$users = $this->userRepository->findAll([
	// 爲關聯添加查詢條件和排序條件
	'ext.address:like' => '%北京%',
	'ext.order' => 'id desc',
], [
	'*', 
	// 查詢關聯表信息
	'ext' => ['id', 'name']
])

4 when 查詢替代方法

  • filterFind($conditions, $columns = [])
  • filterFindAll($conditions, $columns = [])

上述方法會自動過濾$conditions 中的空值(空字符、空數組、null)

在特定情況下,還是比較有用的

$model = User::where('status', '=', 1);
if ($username = request()->input('username')) {
	$model = $model->where('username', '=', $username);
}

if ($type = request()->input('type')) {
	$model = $model->where('type', '=', $type);
}

$users = $model->get()

使用repository

$users = $this->userRepository->filterFindAll([
	'status' => 1,
	'username' => request()->input('username'),
	'type' => request()->input('type')
]);

5 使用findWhere構建複雜的查詢

 $users = $this->userRepository->findWhere([
	 'and', 
	 ['or', ['username:auto_like' => 'test'], ['nick_name', 'like', '%test%']], 
	 ['level' => 5], 
	 ['status', '=', 1],
 ])->get();

上面查詢生成的SQl

select * from `users` where (
	(`users`.`username` like '%test%' or `users`.`nick_name` like '%test%')   
	and `users`.`level` = 5 
	and `users`.`status` = 1
)

更多關於repository的使用方法,可以查看文檔>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章