根據公司的專案的
repository
,優化並去除公司的業務程式碼(繼承思路,程式碼重構),然後和同事一起將repository
開源出來
一 安裝使用
安裝包檔案
composer require littlebug/laravel-repository
生成 model 和 repository
littlebug/laravel-repository
提供了命令列模式生成model
和repository
使用命令
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
建立或者修改的陣列資料資訊
三 特性說明
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
的使用方法,可以檢視文件>>