根據公司的項目的
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', 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 |
創建或者修改的數組數據信息 |
三 特性說明
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
的使用方法,可以查看文檔>>