php - 模型或 Controller 中的动态 SQL

标签 php mysql model-view-controller

我知道所有逻辑等都应该放在 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/

相关文章:

ruby-on-rails - 根据模型状态更改 URL 的逻辑应该位于 Controller 中还是模型中?

mysql - 对好友表进行待处理的好友请求查询并从其他表中获取数据

java - 如何搭建仿真架构,OO设计

php - yii2 如何运行控制台 Controller 功能

php - 查询在 phpmyadmin 中工作正常,但不适用于 mysql_query php 函数

php - 撇号导致已通过 mysqli_real_escape_string & trim 运行的表项的行重复出现错误

php - 用于 PHP/MySQL 开发的 Linux 安装机器

c# - 在网站之间共享 cookie

php - 用户ID动态图片

PHP 和 SQL : Can the same statement return different resultsets by the fact whether it where send by a php script or was send directly via a . SQL 文件?