1

在我的数据库层类中,我有一个将选择 sql 查询作为参数的方法:

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetch(PDO::FETCH_ASSOC);
  return $ret;
}

我希望能够将获取的数据返回到我的模型,然后在我的视图类中循环遍历它,而不在视图中使用任何 PDO。

这应该如何以正确的方式完成?

我希望能够以 $row['testCol'] 等形式访问表格行。

4

3 回答 3

2

模型是一层。不是类或对象。

而且,如果您通过遵守SRP来编写代码,则模型层将包含几种不同类型的结构。至少,您将拥有用于域业务逻辑和存储抽象的单独类。

您在这里所拥有的完全是一团糟。您不仅将域逻辑和存储机制集中在同一个类中(并假装它是“模型”),而且您还将 SQL 直接暴露给表示层。


如果您尝试构建适当的模型层,则当前视图将从服务实例请求信息(这将是结构的类型,用于将域业务逻辑与视图和控制器分开)并获取所需的数据。

该服务将实例化适当的域对象,并根据控制器先前设置的状态,使用某种形式的存储抽象(数据映射器存储库工作单元dao或某种类似结构)将信息检索到它们中。然后,在对填充的域对象执行所需的数据操作之后,它会将数据返回到视图。

View 根据从控制器接收到的信息和先前的信号,将决定应该生成什么样的响应。如果响应的指示是 HTML,它将使用一个或(通常)多个模板来组成输出。认为它还不如只发送一个 HTTP 位置标头来触发重定向。

为了进一步阅读,我会推荐这个答案


关键是:您目前已经将 MVC 的概念简化到甚至打破了表示层和模型层之间的分离的程度。

于 2012-09-28T00:09:31.230 回答
2

您可以轻松返回$stmt。它允许您对其进行迭代,并且可以像这样访问PDO::FETCH_ASSOC

$rows = $model->select($sqlQuery);

...

foreach($rows as $row)
{
    echo $row['testCol'], "\n";
}

在你的函数里面是这样的:

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  return $stmt;
}

保持简单,从长远来看,这将对您有所帮助。您只需要在您的视图中可以访问的东西,例如数组,而 PDO 为您提供了开箱即用的功能。如果需要,您可以稍后轻松地将其替换为 - 比方说 - 一个数组。也许不是数组的最佳示例,但我相信你明白了。

并且只是在页边空白处注明:不要称它为模型,只需称其为数据库或类似名称。它更好地命名总是有用的东西。

于 2012-09-29T15:03:42.153 回答
2

调用fetchAll()而不是fetch(),这将返回一个完整的多维数组。

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
  return $ret;
}

$results = $your_object->select("SELECT * FROM yourtable");
// It's a 2D array!
var_dump($results);
于 2012-09-27T19:31:22.463 回答