在我的数据库层类中,我有一个方法,它将select sql查询作为参数:
public function select($sqlQuery) {
$stmt = $this->pdo->prepare($sqlQuery);
$stmt->execute();
$ret = $stmt->fetch(PDO::FETCH_ASSOC);
return $ret;
}
我希望能够将获取的数据返回到我的模型,然后在我的视图类中循环它,而不在视图中使用任何PDO。
如何以正确的方式做到这一点?
我希望能够以$ row ['testCol']等方式到达表行。
答案 0 :(得分: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);
答案 1 :(得分:2)
模型是一个层。不是一个阶级或对象。
而且,如果您通过遵守SRP编写代码,模型层将包含几种不同类型的结构。至少,您将拥有域业务逻辑和存储抽象的单独类。
你在这里完成的是一团糟。您不仅将域逻辑和存储机制都集中在同一个类中(并假装它是“模型”),而且还将SQL直接暴露给表示层。
如果您尝试构建正确的模型层,则当前视图将从服务实例请求信息(这将是结构的类型,用于将域业务逻辑与视图和控制器分离)并获取数据它需要。
该服务将实例化正确的domain object(s),并且基于先前由控制器设置的状态,使用某种形式的存储抽象(data mapper,repository,{ {3}},unit of work或类似的结构)。然后,在对填充的域对象执行所需的数据操作之后,它会将数据返回到视图。
根据收到的信息和来自控制器的先前信号,查看应该决定应该生成什么样的响应。如果响应的指示是HTML,它将使用一个或(通常)多个模板来组成输出。以为它可能只发送一个HTTP位置标头,以触发重定向。
如需进一步阅读,我建议dao。
重点是:您目前已经简化了MVC的概念,甚至已经破坏了表示层和模型层之间的分离。
答案 2 :(得分: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为您提供开箱即用的功能。如果需要,您可以稍后使用 - 比方说 - 替换它。也许不是阵列的最好例子,但我相信你明白了。
在边缘只是一个注释:不要称它为模型,只是称它为数据库或类似。它更好地命名了总是有用的东西。