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

liujx發表於2019-06-10

根據公司的專案的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');
    }

    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')
]);

更多關於repository的使用方法,可以檢視文件>>

相關文章