【问题标题】:Eloquent models - basing a model on a query instead of a table?雄辩的模型 - 基于查询而不是表的模型?
【发布时间】:2014-11-10 01:10:09
【问题描述】:

我正在 Laravel 中构建一个应用程序,利用 Eloquent ORM 访问本地数据。

此应用程序的部分功能涉及在远程数据库上运行复杂的查询。有一些固定查询需要运行。我可以创建 Eloquent ORM 来像本地基于表的模型一样访问查询数据吗?

我的意思是,为了方便起见,我想将查询视为 ORM 模型中的表,而在模型中,查询正在远程数据库上运行以获取数据。这些将是只读模型。

或者我最好(通过努力 POV)运行一个雄辩的 SQL 查询并直接获取数据,而不是尝试将其包装成更抽象的模型?我只是不知道我的方法会与 eloquent 的技术设计目标作斗争。

编辑:我宁愿不在远程数据库上创建视图来完成查询,尽管乍一看这似乎是个好主意。

【问题讨论】:

  • 如何访问远程数据库?
  • Laravel 允许设置多个数据库驱动程序和身份验证详细信息。雄辩的模型可以被告知使用该列表中的特定数据库。
  • 本质上它只是一个“数据库”,所以与本地数据库相比,远程数据库没有什么特别之处,除了我无法开始在远程数据库上创建对象 - 将其视为读取 -仅限。
  • 好的,谢谢 Jason,我只是确保您正在这样做。当然,您可以只使用 Eloquent,模型可以具有运行特定查询的作用域方法(请查看 Eloquent 文档)。如果安全是您的主要目标,您是否研究过远程存储过程?
  • 阅读上下文,我会做这样的事情:创建一个引用远程数据库的单一模型,然后为每个查询创建上下文?例如MyRemote::query1()->get()MyRemote::query2()->where('timestamp', '<', 'now()')->take(5)?上下文函数(query1 和 query2)将构建基本查询,但我怀疑我需要覆盖 where() 之类的函数,以便条件可以针对复杂查询的正确部分。

标签: sql laravel eloquent


【解决方案1】:

我遇到了与您类似的困境,因为我想为我的应用构建搜索界面。我决定使用迁移类创建数据库视图以简化部署。我将模型设置为视图的理由是避免关系集群。我假设视图只会传输我实际需要的数据并使我的模型更高效。

为了确保模型保持只读状态,我遵循了这个示例 https://gist.github.com/scrubmx/d21b58e6222e515a3bf7

【讨论】:

    【解决方案2】:

    最后,我只是使用查询构建器针对远程数据库构建了查询。这给了我可以使用的远程数据,而不是 Eloquent 模型。它达到了它的目的,但我怀疑我将来可能想重新审视它。

    最后,它是关于在应用程序的每一层中创建适量的抽象,而不会使事情过于复杂。

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2017-05-24
      • 2019-06-27
      • 2021-05-02
      • 2021-08-11
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多