【问题标题】:MVC: Can a view loop through query results?MVC:视图可以遍历查询结果吗?
【发布时间】:2009-07-10 19:02:21
【问题描述】:

我是 MVC 的新手。您已被警告...

我有可以将 MySQL 结果资源返回给控制器的用户模型。控制器将 MySQL 资源传递给要显示的视图。是否可以使用数据库结果获取功能在视图中打印查询结果?

<?php while($row = some_fetching_function($database_result_resource): ?>
<tr>
   <td><?=$row['Username']?></td>
   ...etc
</tr>
<?php endwhile; ?>

这对我来说不合适。它是紧密耦合的,对吧?模型必须返回某种类型的数据库资源,并且视图必须使用某种类型的数据库获取方法循环遍历它。可以在不循环两次结果的情况下将其解耦吗?我认为您必须遍历模型中的结果以创建结果数组,然后再次在视图中。

总结:

  1. 视图能否在遵守 MVC 设计模式的同时显示数据库结果资源?
  2. 是否可以避免循环遍历数据两次,同时避免与数据库的紧密耦合?

【问题讨论】:

    标签: php database model-view-controller


    【解决方案1】:

    如果您抽象出代码的数据库部分,我认为这是可以接受的。例如,您可以提供一个可以迭代的“行集”(实现 Iterable 接口或其他东西)。在幕后,这个对象可以包含一个数据库结果并使用获取功能。

    基本上,这个想法是您的视图处理外观通用的行集,这并不意味着它来自数据库或任何其他来源,这样可以减少耦合。

    【讨论】:

      【解决方案2】:

      当然可以。但是您实际上不应该获取视图中的行。在控制器中分配模型数据,而不是直接在视图中。正如 Hooray Im Helping 所指出的,数据的获取取决于您使用的模型。但是您的视图中不应包含任何特定于数据库的方法或模型逻辑。如果模型实现了一个通用的Iterator 接口,你可以将它直接传递给视图。

      <?php
      public function someControllerAction($params)
      {
          $myModel = Model::getModel('Model Name');
          // But you don't do Model::getModel('Model Name')->getResults($params['date']) in your viewa
          $this->view->rows = $myModel->getResults($params['date']);
      }
      ?>
      

      【讨论】:

      • 这并不能避免 OP 中的要求 2。您可以使用实现 Iterator 接口的类包装器来完成他的要求。
      • "在您的控制器中进行获取,将其放入一个数组并将其传递给您的视图。"我很困惑,Daff - 获取不应该在模型中完成,而不是在控制器中完成?
      • 嗯,好吧,这不是描述它的最佳方式。我想这也取决于架构。我的意思是,模型数据到视图的分配应该发生在控制器中,而不是视图中(至少在我使用的大多数基于请求/响应的 PHP 框架中)。
      【解决方案3】:

      正如 Jani 所说,您可能应该将 MySQL 结果包装在一个实现标准 PHP 库中的 Iterable 接口的类中。这样,您的视图可以使用熟悉的通用 foreach 构造,而不必为了将结果放入数组而对结果进行两次迭代。

      SPL

      rswrap 类实现迭代器 { 变量 $rs; 变量$当前; 函数 __construct($rs) { $this->rs = $rs; } 函数倒带() { // 没做什么 } 函数下一个() { $this->current = some_fetching_function($this->rs); } 函数电流() { 返回 $this->current; } 函数有效() { 返回 $this->current !== false; } 功能键() { 返回0; // 通常就足够了,但您可能想要编写一个真正的键函数。 } } $resultset = new rswrap($database_result_resource); foreach($resultset as $row) { // 你的代码在这里 }

      【讨论】:

        【解决方案4】:

        我认为最好的方法是将SQL查询的结果抽象成一个对象列表并返回该列表。

        我认为迭代行集不会将视图与您正在使用的特定数据库连接分离。视图应该独立于正在使用的数据库连接。如果您决定使用 JDBC 或休眠或任何转换不需要修改视图。

        【讨论】:

          猜你喜欢
          • 2015-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          • 2015-05-09
          • 1970-01-01
          • 1970-01-01
          • 2016-07-08
          相关资源
          最近更新 更多