Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在哪里放置非雄辩的相关SQL查询

在哪里放置非雄辩的相关SQL查询
EN

Stack Overflow用户
提问于 2014-06-30 11:09:05
回答 2查看 121关注 0票数 1

我用雄辩的语言来实现我的模型。它有很多方法使使用模型更加容易。但是,在某些情况下,我必须实现访问数据库的功能,但不返回一个雄辩的模型。

例如,设想一个常见的用户模型。雄辩在CRUD操作方面对用户模型有很大的帮助,但是如果我必须实现一个返回一些用户统计信息的方法(例如。总用户数、活跃用户数等)。

我应该在哪里实现这个功能?在雄辩的模型中,作为一个public static函数(例如User::getStats()),或者应该有一个不同的类。

在雄辩的模型上使用这些方法似乎有点不自然,因为它们与雄辩无关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-30 12:06:35

一如既往,这取决于您的项目和用户在其中扮演的角色。

但基本上,不,我不认为构建报告的逻辑属于用户模型。虽然它可能与用户相关,但是对于坚实的原则,用户类只应该有一个责任,在这种情况下,就是处理用户实体。

这包括获取和设置实例的属性,在一个简单的项目中,在模型上定义一些作用域也很好,例如只选择active用户,比如User::getActive();

但是,随着项目的发展,您应该考虑使用更具体的类。

例如,您可以将雄辩的功能抽象到用户库中。因此,现在您有了实体本身上的操作处理程序,如

代码语言:javascript
运行
AI代码解释
复制
$userRepo->getAll();
$userRepo->getActive();
$userRepo->getInactive();

以及用户实例的处理程序:

代码语言:javascript
运行
AI代码解释
复制
$user->getName();
$user->setStatus();

创建报告和统计数据是一个完全不同的主题。这样你就可以得到像UserReportBuilder oder UserStatisticsService这样的东西

代码语言:javascript
运行
AI代码解释
复制
$userStats->getMostActive();
$userStats->getRegistrationsPerDay();

一个简单的例子:

// UserRepository:

代码语言:javascript
运行
AI代码解释
复制
class UserRepository
{

  protected $model = $model;

  public function __construct($model)
  {
     // you pass in an instance of the actual Eloquent model
     // so you have the whole power of eloquent in here
     $this->model = $model;
  }

  public function getActive()
  {
     // this returns a collection of models
     return $this->model->where('status', 'active')->get();
  }

}

$userRepo = new UserRepo(new User);

差不多就是这样了。您仍然可以雄辩地工作,但是您已经将功能分离成不同的部分,并承担起了工作的责任。因此,您的UserStats类只能用于构建用户统计信息:

代码语言:javascript
运行
AI代码解释
复制
class UserStats
{
    // You could pass in the Repository through the constructor
    // or just use the Eloquent model directly

    public function getRegistrationsPerDay()
    {
        return User::groupBy('day')->get(
            [
                 DB::raw('DATE(created_at) as day'),
                 DB::raw('count(*) as registration_count')
            ]
        );
    }
}

用户实例或UserStats不需要知道如何获取所有用户,并且用户实例或UserRepository不需要知道如何每天计算注册,因此将该功能拆分为单独的、独立的部分是有意义的,它们只做一件事。

我认为你明白这个想法,我希望这是有意义的。也许您应该让自己更熟悉实心原理,并在遇到类似问题时试着记住它们。

票数 1
EN

Stack Overflow用户

发布于 2014-06-30 11:31:03

这真的取决于你,但决定一次会议并坚持下去是个好主意。

我的经验法则是:

  1. 如果它与通常由雄辩模型表示的单个项目相关,那么将其作为该模型上的一个公共静态方法进行处理。例如,在我的当前项目中,我有一个Contract模型。我需要一种方法,为新合同生成一个契约ID字符串(用于与遗留系统的兼容性)。这与单个项目(合同)有关,但出于技术原因,需要与雄辩的模型(即:)分开生成。它基于一个具有不同连接的单独数据库)。因此,我创建了一个公共静态方法:public static function generateContractIdentifier($id, $salesRep)。如果使用存储库访问数据库,则可以将其放在数据库中。
  2. 如果它更一般的话。没有与雄辩模型的实例挂钩),我将其放入单独的库中。例如,在同一个应用程序中,我有一个用于处理打印项目的队列(一个工业过程)。应用程序有一个仪表板,我需要显示当前的队列状态以供管理。为此,我创建了一个ProcessStatus库,并实现了一个方法:public function getStatus(),它运行一个查询,并将结果作为一个数组在视图中显示。这与队列中的任何特定项无关,因此我将其放在单独的库中。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24497215

复制
相关文章
【Android Gradle 插件】自定义 Gradle 插件模块 ④ ( META-INF 中声明自定义插件的核心类 | 在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件 )
参考 Android Gradle 插件内容 , 将 Android Studio 的 Project 面板中的 External Libraries 展开 ,
韩曙亮
2023/03/30
1.6K0
【Android Gradle 插件】自定义 Gradle 插件模块 ④ ( META-INF 中声明自定义插件的核心类 | 在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件 )
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑥ ( 在 buildSrc 模块中依赖 Android Gradle 插件 | 完整代码示例 )
在 Android Studio 工程的根目录的 buildSrc 模块下的 src/main/groovy 代码 , 自动引入了 Groovy , Gradle , Java 依赖库 , 可以直接调用上述 API ;
韩曙亮
2023/03/30
1K0
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑥ ( 在 buildSrc 模块中依赖 Android Gradle 插件 | 完整代码示例 )
【Android Gradle 插件】Gradle 构建机制 ⑤ ( 在 Android Studio 中查看 Android Gradle 插件源码 )
选择 " 菜单栏 / File / New / New Project… " 选项 ,
韩曙亮
2023/03/30
1.8K0
【Android Gradle 插件】Gradle 构建机制 ⑤ ( 在 Android Studio 中查看 Android Gradle 插件源码 )
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )
在 自定义 Gradle 插件 的 Extension 扩展 中 , 可以定义方法 , 定义的方法可以带参数 , 也可以不带参数 ;
韩曙亮
2023/03/30
1.8K0
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )
android gradle command not found在Mac中
这个问题是在命令行中使用gradle命令不存在 只需要找到本地的gradle然后加到.zshrc文件中
tea9
2022/07/16
1.1K0
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ② ( buildSrc 目录中实现 Gradle 插件 | 实现 Gradle 插件代码 | 模块引入插件并编译 )
在 buildSrc 模块 中的 src/main/groovy 目录 下 , 创建 MyPlugin.groovy 代码文件 作为插件的主要代码 , 代码如下 :
韩曙亮
2023/03/30
5380
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ② ( buildSrc 目录中实现 Gradle 插件 | 实现 Gradle 插件代码 | 模块引入插件并编译 )
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )
在上一篇博客 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 ) 中 , 实现了 自定义插件 的 扩展 Extension , 在 Module 模块下的 build.gradle 构建脚本中 , android 配置块 就是一个 AppExtension 扩展 , 但是在 android 扩展下又定义了 defaultConfig 扩展 , 这是一个 ProductFlavor 配置 ;
韩曙亮
2023/03/30
2.1K0
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )
Android apk中so库文件未压缩
升级AS 3.6.1, 并且升级project build.gradle AGP 到3.6.1, 一个项目发现打包后文件骤然增大, 查看apk包,发现apk 包中so库文件未被压缩. 但是一个类似项目,相同版本却没有问题
全栈程序员站长
2022/07/02
1.3K0
Android apk中so库文件未压缩
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ③ ( 在 Gradle 构建脚本中实现 AndroidManifest.xml 清单文件切换设置 )
在上一篇博客 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ① ( 组件化简介 | 创建组件化应用 | 依赖库模块 / 应用模块 切换设置 ) 最后提到了 在 Gradle 构建脚本中 , 需要实现 依赖库模块 / 应用模块 切换设置 , 主要涉及如下两个方面 :
韩曙亮
2023/03/30
2.2K0
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ③ ( 在 Gradle 构建脚本中实现 AndroidManifest.xml 清单文件切换设置 )
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ① ( buildSrc 目录中实现 Gradle 插件 | 创建 src/main/groovy 源码目录并编译 )
创建 Gradle 插件 , 一般是在 Android Studio 或者 IntelliJ IDEA 中 , 创建一个插件模块 , 这里以 AS 中为例 ;
韩曙亮
2023/03/30
1.6K0
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ① ( buildSrc 目录中实现 Gradle 插件 | 创建 src/main/groovy 源码目录并编译 )
【Android Gradle 插件】自定义 Gradle 插件模块 ① ( 在 Module 模块中自定义 Gradle 插件 | 创建自定义插件类型模块 | 手动导入相关依赖 )
在上一篇博客 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 ) 中 , 总结了在 Android Studio 工程中 自定义 Gradle 插件 , 并在 build.gradle 构建脚本 中导入插件的代码 ;
韩曙亮
2023/03/30
2.2K0
【Android Gradle 插件】自定义 Gradle 插件模块 ① ( 在 Module 模块中自定义 Gradle 插件 | 创建自定义插件类型模块 | 手动导入相关依赖 )
Android – 在Gradle中更改APK文件名
默认情况下,Android Studio中的Gradle构建命名为.apk文件app-release.apk。对应用程序build.gradle文件进行了一些小的更改,可以将.apk名称更改为<app name>-release-<version>.apk。 需要在app的目录下面修改build.gradle文件。 第一步是将project.archivesBaseName设置为您的应用程序名称。 android { compileSdkVersion 25 buildToolsVersio
code_horse
2018/07/02
3K0
【Android Gradle 插件】自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 )
在插件模块中的 src/main 目录 下创建 groovy 目录 , 用于存放 Groovy 代码 , 在其中定义包名以及包名下的源码 :
韩曙亮
2023/03/30
1.8K0
【Android Gradle 插件】自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 )
【Android Gradle 插件】自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)
Gradle 任务就是一个 Task 类 , 在 Gradle 脚本中 , 可以 自定义 Task 类 ,
韩曙亮
2023/03/30
8880
【Android Gradle 插件】自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)
【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 )
在 Gradle 自定义插件 Plugin 中 , 如果要执行复杂的工作 , 可以在 实现的 Plugin 接口的 apply 函数中执行 ;
韩曙亮
2023/03/30
1K0
Android中Gradle使用
Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。
海哥@开发
2022/04/06
8690
Android中Gradle使用
Android Studio 自定义Gradle插件
之前写了一个Android中的AOP框架Cooker.这里总结一下里面用到的两块小知识:
乱码三千
2021/07/29
8770
Android Studio 自定义Gradle插件
Gradle For Android(9)--自定义构建
现在我们知道了Gradle如何工作,如何创建自己的Task以及Plugin,如何执行test任务,如何设置CI。这一章会包含一些小技巧,接下来会从以下Topic进行讨论:
None_Ling
2018/10/24
7250
Gradle For Android(9)--自定义构建
【Android Gradle 插件】Gradle 映射文件 ( settings.gradle 映射为 Settings 类 | build.gradle 映射为 Project 类 )
Android Plugin DSL Reference 参考文档 : https://google.github.io/android-gradle-dsl/2.3/
韩曙亮
2023/03/30
6260
【Android Gradle 插件】Gradle 映射文件 ( settings.gradle 映射为 Settings 类 | build.gradle 映射为 Project 类 )
点击加载更多

相似问题

Android Gradle 3.0和本地库的“未解析引用R”

11

android项目中未解析android项目库中的类

21

Android Studio Gradle依赖项未解析

13

Android Gradle --在gradle中实现Apache时未能解决错误

325

Gradle未能解析Android中的库

127
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档