【Laravel】存储仓Repository基础

laravel 存储仓基础

  • laravel存储仓基础
    • 创建存储仓
    • 手动创建存储仓
      • 创建接口
      • 创建接口实现
      • 测试接口
  • Criteria 封装查询逻辑的模式
        • 作用
        • 使用场景
    • 使用示例
      • 封装商品排序逻辑
      • 封装商品状态过滤逻辑
      • 业务逻辑封装
      • 创建测试控制器
      • 测试与结果

laravel存储仓基础

本文基于 Laravel 9.* 版本,PHP 8.2 进行开发,所用扩展为 l5-repository。

安装命令:
composer require prettus/l5-repository

创建存储仓

如果尚未创建过存储仓库的 Model,可以直接使用以下命令生成存储仓库文件:

php artisan make:repository Goods/Goods

此命令会自动生成 Model 及对应的存储仓库文件。

手动创建存储仓

创建接口

首先,创建一个存储仓库接口:

namespace App\Repositories\Goods\Interfaces;
use Prettus\Repository\Contracts\RepositoryInterface;/*** Interface GoodsRepositoryRepository.** @package namespace App\Repositories\Goods;*/
interface GoodsRepository extends RepositoryInterface
{/**** 获取商品列表信息** @param $request* @return mixed*/public function goodsPaginate($request);
}

创建接口实现

接下来,实现该接口:

namespace App\Repositories\Goods;use App\Models\Goods;
use App\Repositories\Goods\Interfaces\GoodsRepository;
use Prettus\Repository\Criteria\RequestCriteria;
use Prettus\Repository\Eloquent\BaseRepository;/*** Class GoodsRepositoryRepositoryEloquent.** @package namespace App\Repositories\Goods;*/
class GoodsRepositoryEloquent extends BaseRepository implements GoodsRepository
{/*** Specify Model class name** @return string*/public function model(){return Goods::class;}protected $fieldSearchable = ['goods_name'=>'like','goods_subname'=>'like','goods_no'=>'like',];/*** Boot up the repository, pushing criteria*/public function boot(){$this->pushCriteria(app(RequestCriteria::class));}public function goodsPaginate($request){// TODO: Implement goodsPaginate() method.$this->applyCriteria();$this->applyScope();$limit = (int)($data['page_size'] ?? 25);$limit = abs($limit) < 2000 ? abs($limit) : 2000;$page = abs((int)($data['page'] ?? 1));$results = $this->model->paginate($limit, ['*'], $pageName = 'page', $page);$this->resetModel();return $this->parserResult($results);}
}

在 config/app.php 中注册服务提供者

'providers' => [// .....App\Providers\RepositoryServiceProvider::class,
]

在 RepositoryServiceProvider 中绑定服务

 public function boot(){$this->app->bind(\App\Repositories\Goods\Interfaces\GoodsRepository::class, \App\Repositories\Goods\GoodsRepositoryEloquent::class);}

创建测试 Controller

namespace App\Http\Controllers\Learn;use App\Http\Controllers\Controller;
use App\Repositories\Goods\Interfaces\GoodsRepository;
use Illuminate\Http\Request;class GoodsController extends Controller
{/*** @var GoodsRepository*/protected $repository;/*** GoodsController constructor.** @param GoodsRepository $repository*/public function __construct(GoodsRepository $repository){$this->repository = $repository;}public function getList(Request $request){return $this->repository->goodsPaginate($request);}
}

测试接口

访问接口:

http://xxx.test/api/Learn/goods/getList?search=goods_name:haha

返回的结果会是 goods_name 字段进行 like 模糊匹配,查询条件为 haha。

Criteria 封装查询逻辑的模式

Criteria 是一种用于封装查询逻辑的模式,可以将复杂的查询条件独立成类,从而提高代码的复用性、可读性和维护性。

作用
  • 动态过滤数据:通过 Criteria,你可以根据请求参数或业务需求动态地添加查询条件
  • 解耦查询逻辑:Criteria 将查询逻辑从仓库实现中分离出来,方便代码复用和测试
  • 链式调用:Criteria 可以组合使用,逐步添加查询条件
使用场景
  • 按条件过滤:例如,根据用户输入的关键词或筛选条件动态调整查询结果
  • 全局查询逻辑:比如,自动添加 where 条件过滤被软删除的数据
  • 复杂查询逻辑:将复杂查询封装到 Criteria 类中,保持代码简洁

使用示例

为了实现商品的灵活排序和状态筛选,我们通过以下两种 Criteria 对商品查询逻辑进行了封装:GoodsSortCriteria 用于处理排序逻辑,GoodsPublishedCriteria 用于状态筛选。下面是具体实现及业务调用的方式。

封装商品排序逻辑

GoodsSortCriteria 通过解析输入参数中的排序选项,动态生成排序规则,从而支持多种排序模式

namespace App\Criteria\Goods;use Prettus\Repository\Contracts\CriteriaInterface;
use Prettus\Repository\Contracts\RepositoryInterface;class GoodsSortCriteria implements CriteriaInterface
{public function __construct($filterData){$this->request = $filterData;}const SORTBYCATEGORY = ['price-descending' => 'price_descending','price-ascending' => 'price_ascending','created-descending' => 'created_descending','created-ascending' => 'created_ascending',];public function apply($model, RepositoryInterface $repository){$type = self::SORTBYCATEGORY[$this->request['sort']] ?? '';switch ($type) {case 'price_descending':$model = $model->orderByRaw('goods_price DESC');break;case 'price_ascending':$model = $model->orderByRaw('goods_price ASC');break;case 'created_ascending':$model = $model->orderByRaw('created_at ASC');break;case 'created_descending':$model = $model->orderByRaw('created_at DESC');break;default:$model = $model->orderByRaw('id DESC');}return $model;}
}

封装商品状态过滤逻辑

GoodsPublishedCriteria 用于筛选商品状态,返回已发布且审核通过的商品

namespace App\Criteria\Goods;use Prettus\Repository\Contracts\CriteriaInterface;
use Prettus\Repository\Contracts\RepositoryInterface;class GoodsPublishedCriteria implements CriteriaInterface
{public function apply($model, RepositoryInterface $repository){return $model->where('goods_status', 1)->where('goods_verify', 1);}
}

业务逻辑封装

在业务层,通过 GoodsService 结合上述 Criteria 实现商品的排序与筛选功能

namespace App\Services\Study;use App\Criteria\Goods\GoodsPublishedCriteria;
use App\Criteria\Goods\GoodsSortCriteria;
use App\Repositories\Goods\Interfaces\GoodsRepository;class GoodsService
{public $goodsRepository;public function __construct(GoodsRepository $goodsRepository){$this->goodsRepository = $goodsRepository;}public function goodsFilterAndSort($filterData){$this->goodsRepository->pushCriteria(new GoodsSortCriteria($filterData));$this->goodsRepository->pushCriteria(new GoodsPublishedCriteria($filterData));return $this->goodsRepository;}public function goodsPaginator($filterData){return $this->goodsFilterAndSort($filterData)->goodsPaginate($filterData);}
}

创建测试控制器

通过 GoodsController 调用 GoodsService,实现接口逻辑

namespace App\Http\Controllers\Learn;use App\Http\Controllers\Controller;
use App\Repositories\Goods\Interfaces\GoodsRepository;
use App\Services\Study\GoodsService;
use Illuminate\Http\Request;class GoodsController extends Controller
{public function getServerList(Request $request){return app(GoodsService::class)->goodsPaginator($request);}
}

测试与结果

通过访问接口验证实现效果:

http://jwj.test/api/Learn/goods/getGoodsList?sort=price-descending

结果:

  • 按价格从高到低排序,返回符合条件的商品列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年一级建造师考试成绩,即将公布!

一级建造师考试成绩一般在考试结束后3个月左右的时间公布&#xff01; 根据官方通知&#xff0c;重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到&#xff1a;2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…

基于Matlab的图像去噪算法仿真

中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪&#xff0c;并用Matlab软件仿真。 &#xff08;1&#xff09;给图像加入均值为0&#xff0c;方差为0.02的高斯噪声&#xff0c;分别选择33模板、55模板和77模板进行去噪 Matlab部分代码&#xff1…

交通流量预测:基于交通流量数据建立模型

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

嵌入式QT学习第4天:Qt 信号与槽

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章思维导图如下&#xff1a; 不使用 Qt Designer 的方式进行开发&#xff0c;用代码绘界面&#xff0c;可以锻炼我们的布局能力&#xff0c;和代码逻辑能力&#x…

多线程+线程池

普通线程的创建 三种创建方式实例&#xff1a; 多线程本质上是毫无关系的&#xff0c;执行顺序是不可预知的&#xff0c;但是由于callable方式创建的对象有返回值所以主函数在执行的时候&#xff0c;需要等待返回值回来才能继续执行其他线程&#xff0c;所以在这种状态下是…

mac访达打开终端

选择文件夹打开 选中文件夹&#xff0c;然后右键即可&#xff1a; 在当前文件夹打开 在访达的当前文件夹长按option键 左下角出现当前文件夹路径 右键即可打开终端

【模型剪枝】YOLOv8 模型剪枝实战 | 稀疏化-剪枝-微调

文章目录 0. 前言1. 模型剪枝概念2. 模型剪枝实操2.1 稀疏化训练2.2 模型剪枝2.3 模型微调总结0. 前言 无奈之下,我还是写了【模型剪枝】教程🤦‍♂️。回想当年,在写《YOLOv5/v7进阶实战专栏》 时,我经历了许多挫折,才最终完成了【模型剪枝】和【模型蒸馏】的内容。当时…

Django 路由层

1. 路由基础概念 URLconf (URL 配置)&#xff1a;Django 的路由系统是基于 urls.py 文件定义的。路径匹配&#xff1a;通过模式匹配 URL&#xff0c;并将请求传递给对应的视图处理函数。命名路由&#xff1a;每个路由可以定义一个名称&#xff0c;用于反向解析。 2. 基本路由配…

单点登录原理

允许跨域–>单点登录。 例如https://www.jd.com/ 同一个浏览器下&#xff1a;通过登录页面产生的cookie里的一个随机字符串的标识&#xff0c;在其他子域名下访问共享cookie获取标识进行单点登录&#xff0c;如果没有该标识则返回登录页进行登录。 在hosts文件下面做的域名…

保持角色一致性!flux新模型redux用法(含模型与工作流)

​ 目录 redux模型是什么&#xff0c;能干啥&#xff1f; 用到的工具有哪些&#xff1f; 工具和模型文件在哪里下载&#xff1f; 整合包&#xff1a; 下载后需要分别放到指定目录&#xff1a; redux模型怎么用&#xff1f; 加载工作流 上传图片和输入提示词 生成结果…

FastAPI 跨域访问cors设置

问题发现 前端vue3写了个页面&#xff0c;调用后台一个服务&#xff0c;出现了跨域访问错误&#xff0c;截图如下&#xff1a; 示例代码如下&#xff1a; from typing import Unionfrom fastapi import FastAPI from pydantic import BaseModel import randomapp FastAPI()…

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤&#x1f381;框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 &#x1f381;框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…

音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍

随着互联网技术的飞速发展&#xff0c;音视频流媒体直播已成为现代社会信息传递与娱乐消费的重要组成部分。在这样的背景下&#xff0c;EasyDSS互联网视频云平台应运而生&#xff0c;它以高效、稳定、便捷的特性&#xff0c;为音视频流媒体直播领域带来了全新的解决方案。 1、产…

51单片机快速入门之中断的应用 2024/11/23 串口中断

51单片机快速入门之中断的应用 基本函数: void T0(void) interrupt 1 using 1 { 这里放入中断后需要做的操作 } void T0(void)&#xff1a; 这是一个函数声明&#xff0c;表明函数 T0 不接受任何参数&#xff0c;并且不返回任何值。 interrupt 1&#xff1a; 这是关键字和参…

某航客服部满意度调查及管理改进项目纪实

某航客服部满意度调查及管理改进项目纪实 ——采用信息化的调查工具&#xff0c;调研并提高员工积极性 【客户行业】航空航天 【问题类型】企业管理问题诊断 【客户背景】 某公司是某大型航空公司旗下的客户服务中心&#xff08;以下简称为客服部&#xff09;&#xff0c;…

[巅峰极客 2021]签到

[巅峰极客 2021]签到 给了我们好多表情&#xff0c;真的是一脸懵逼 注意给我们的关键词 GAME 现在还不知道是什么意思我们去试着解开一下 用这个emoji表情解密器&#xff0c;这里我找了好久才找到一个 emoji-aes 这里的Key值就是GAME 运行后出现flag NSSCTF{10ve_4nd_Peace…

docker-compose 升级

官方下载地址&#xff1a; https://github.com/docker/compose/releases 下载完放到kali root目录下 # mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose # chmod x /usr/local/bin/docker-compose # docker-compose --version

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马&#xff0c;请找到木马的密码提交 2.服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 3.不死马是通过哪个文件生成的&#xff0c;请提交文件名 4.黑客留下了木马文件&#xff0c;请找出黑客的服务器ip提交 5.黑客留…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下&#xff1a; /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本&#xff0c;按需选择安装2.5 安装docker2.6 启动docker 并 开机…

内核模块里获取当前进程和父进程的cmdline的方法及注意事项,涉及父子进程管理,和rcu的初步介绍

一、背景 在编写内核态系统监控代码时&#xff0c;有时候为了调试的便捷性&#xff0c;不仅要拿到异常事件有关的线程id&#xff0c;进程id和父进程id&#xff0c;还需要拿到当前进程和父进程的comm和cmdline。主要有几下几个原因&#xff1a; 1&#xff09;单纯的pid或者tgi…