gpt4 book ai didi

php - 模型或 Controller 中的动态 SQL

转载 作者:行者123 更新时间:2023-11-29 00:24:43 27 4
gpt4 key购买 nike

我知道所有逻辑等都应该放在 Controller 中,但我有一个 SQL 语句,其中的某些部分由另一个函数的返回值决定。

在我的模型中:

    $cols = 'products.id, name, currencies.symbol, basePrice';
$m = new AuthController();
if($m->moduleExists('Sales'))
{
$cols .= 'lastSold';
}

或者在我的 Controller 中将 SQL 作为参数传递给模型?

    $cols = 'products.id, name, currencies.symbol, basePrice';
if($this->moduleExists('Sales'))
{
$cols .= 'lastSold';
}

最佳答案

tldr;版本

考虑到关注点分离和解耦,与持久化相关的代码最好不包含与特定系统的子模块相关的业务逻辑(无论该逻辑属于模型部分、MVC 的 Controller ,还是 Controller 部分,或程序员引入系统的任何其他部分)。应避免从持久层访问业务逻辑以保持解耦,应首选业务逻辑访问持久层的另一种方式。

理由

在您的模型中,您应该放置与显示在您的 View 中的内容无关的代码,即模块是否存在或是否被授权拥有这样的模块。您模型中的代码应该可供您的子系统、其他系统、任何独立于您的 View 甚至与特定用例相关的业务逻辑使用。它应该具有与系统范围相关的逻辑。尽管授权似乎具有系统范围,但应格外小心处理,因为它可能导致脆弱的设计。在 Controller 级别拥有它更灵活。想象一下,尝试支持多种授权技术。

根据授权或查看条件修改查询将不会保持稳定的独立模型。

所以是的,它应该放在你的 Controller 中。

Controller ,无论它是与 View 相关的 Controller 还是与特定业务逻辑相关的 Controller (用例相关或系统相关,即授权 Controller )现在都可以具有更改查询的授权标准,并且将来可能会出现其他一些标准与特定用例或子系统域相关。这意味着 Controller 可以更改,而且您甚至可以引入不同的 Controller 以特定方式访问同一模型。

实现

有很多方法可以解决您的问题。比如,

  • 从您的持久层检索您的数据的完整版本,即所有列,并让您​​的 Controller 根据逻辑(即用户授权)决定显示什么
  • 在您的持久层中有多个查询独立于您的其他逻辑,即 queryProducts、queryProductsWithTotals、queryProductsWithLastSoldDate,然后让您的业务逻辑 Controller 决定调用哪个
  • 在持久层中创建一个通用函数,接受 cols(如果可能的话,非魔术值)以便根据其他 Controller 具有的逻辑对可以查看的内容进行参数化,并相应地调用此函数
  • 一般来说,最好避免将sql查询放在不同的地方,因为这会增加维护的难度。然而,在某些情况下,这可能会发生,并且在很大程度上取决于系统的设计,即业务 Controller 为每个用例调用持久层以执行自定义查询。

关于php - 模型或 Controller 中的动态 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19477792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com