Laravel 中数据库查询构建器的位置

Posted

技术标签:

【中文标题】Laravel 中数据库查询构建器的位置【英文标题】:Place for database query builder in Laravel 【发布时间】:2017-03-27 21:29:42 【问题描述】:

我可以使用范围来执行与模型相关的基本查询(例如选择那些今天过生日的用户),范围显然放在 Eloquent Models 中并返回 Eloquent Query Builder 的实例。但是,如果我需要执行更复杂的查询,比如按电子邮件类型对大量电子邮件日志表进行分组、加入用户和电子邮件并应用一些聚合,该怎么办?由于查询的结果字段是混合的(电子邮件、电子邮件类型、用户、日志字段),我必须使用 Database Query Builder。我正在犹豫是否要给建设者打电话的最佳地点。

可以是主模型中的静态方法,我将其他表加入到:

    class ConcreteModel extends Model 

      public static function someQuery(): \Illuminate\Database\Query\Builder 
        return \DB::table('some_table')->join('something');
      

    

或者也许宁愿将这些东西放在需要它的服务中?

【问题讨论】:

控制器或服务可能是此类查询的好地方。 @linuxartisan 我害怕将任何业务逻辑弄乱我的控制器,这就是为什么我认为应该将查询放在消费服务中作为模型的替代品。 为什么不使用存储库模式?您可以轻松地分离业务逻辑和数据结构的层。 您也可以在模型上调用 join。您不必为此使用 DB 外观。 @Hilmi 但 Eloquent 将模型属性映射到特定表上,即每个模型一个表。使用带有连接的模型对我来说毫无意义(尽管我可能错了),这就是为什么我使用返回 StdClass 对象集合的外观。否则,我最终会得到一组具有不相关属性的模型。在模型上调用这种复杂的自定义查询甚至会破坏模型关系,例如,如果我没有在复杂查询的 select 语句中包含主键或外键。 【参考方案1】:

嗯,我想出了使用访问者模式来封装复杂查询的想法。访问者对象封装了具体的查询,雄辩的模型可以接受客户端传递的访问者,并在他们身上调用标准方法,将自己传递给访问者,并将带有访问者结果的 StdClass 集合交还给客户端。好像对我有用。

【讨论】:

以上是关于Laravel 中数据库查询构建器的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 laravel 构建器的 JSON 列查询

对 Laravel 查询构建器的 SQL 查询

将原始 SQL 转换为 Laravel 查询构建器

Laravel:嵌套查询连接导致子数组

Laravel 查询构建器和表名

是否有必要在 laravel 中为数据库操作创建模型(用于查询构建器)?