【发布时间】:2014-10-24 16:26:32
【问题描述】:
我是 PDO 的新手,不完全确定我是否在正确的地方/方式寻找我想要的用途。
PDO 看起来很不错,但我发现这种代码很长,不想在我运行的每个查询中都使用它:
$sth = $database->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
我宁愿使用这样的东西:
$array =
'calories' => $calories,
'colour' => $colour
);
$db->insert("fruit", $array);
(同样我想进行更新调用,并且我希望它适用于每个插入/更新,以便将键名作为表中的字段,并将值作为插入/更新的值)。
我看重的是:
- 在我自己的脚本中使用最少的代码,仅使用数组并在其他地方处理 PDO 语句(包括错误捕获)。
- 仍然利用 PDO 附带的预准备语句和面向对象编程。
我找到了很多答案,但他们提出了许多不同类型的解决方案,包括:
总而言之,似乎有很多选择,但我不知道最推荐的方法是什么,甚至具体的区别是什么。
请照亮我:我应该在这里寻找什么以及在哪里寻找?!
【问题讨论】:
-
PDO 是一个原始的 SQL 驱动程序接口。它统一提供的唯一便利是绑定参数。所以是的,辅助函数或抽象是要走的路。就像没有人再使用纯粹的 JavaScript 一样,您不应该编写乏味的 PDO 咒语。然而,没有一种万能的。 ORM 和查询构建器通常被描述为 SQL 训练轮,而 Active Record 或 CRUD 包装器简化了
->insert用例。根据您的数据库结构,自定义实用程序函数(至少对于数组绑定或更简单的参数绑定)可能会更有效率。 -
@mario 谢谢,这就是我正在寻找的答案!你能把这个作为答案吗?如果您可以提供一些示例或关于如何在不同选项之间进行选择的建议,这将使其更加有用!
-
“ORM 和查询构建器通常被描述为 SQL 训练轮” 这真是一种糟糕的表达方式。它们绝不是“训练轮”。当你信任它发出正确的查询时,你使用 ORM,当你不能时,你绕过它或自定义它。 95% 的情况下,一个好的 ORM 会做正确的事情,而且代码和错误风险比手工操作要少得多。
-
@tadman 我想说这在很大程度上取决于您的应用程序类型。一个最简单的 CRUD 应用程序可能在大多数情况下都可以使用 ORM。如果您有一些复杂的数据结构,尽管具有高度的数据库规范化和/或您正在使用抽象 ORM 不支持的特定数据库的特殊功能,那么配置 ORM 并使其行为可能需要更多的工作而不是手动编写查询。如果你发现绕过 ORM 的时间超过一半,那可能就不值得了。
-
@deceze 大多数人不会编写这类应用程序,即使是那些应用程序,也可以使用常规 ORM 处理大部分查询。仅仅因为您有一些边缘情况并不意味着您需要让自己承受手工编写每个查询的痛苦世界。