假设我有一个名为Books的课程。在该课程中,我有一种方法可以获取一本书或几本书的标题,价格和类别。所以像这样:
public function fetchRows () {
$sql = $con->prepare("SELECT Title, Price, Category FROM Books");
$sql->execute();
return $sql->fetchAll();
}
一切都很好,但是我们现在想要获取另一行,order
结果和limit
返回的行数。为此编写另一种方法会起作用,但那会导致一些荒谬的方法,而且只是凌乱而且不符合DRY规则。我可以使用参数来自定义prepare语句,然后我可能最终会在参数中编写整个查询,而且看起来似乎并不牢固。
我的问题是如何编写/构造适应最终用户试图获得的方法/类?
很抱歉,这对特定问题不是一个问题。我已经阅读了一些关于我的问题的材料,但是我很难将这种模式包裹在我的头脑中,我希望有人可以提供一些解释或示例来帮助我理解这一点。
答案 0 :(得分:1)
您是否考虑过使用位于数据库顶部的ORM(对象关系映射器)?我强烈推荐Doctrine 2 http://www.doctrine-project.org。这样,您可以将数据库表中的行视为对象:所有数据库交互都被抽象掉了(如果需要,您仍然可以直接运行SQL查询)。
如果您不熟悉ORM的概念,Doctrine允许您编写如下代码:
$user = new User();
$user->username = 'test';
$user->email = 'test@example.com';
$entityManager->persist($user);
$entityManager->flush();
您只需运行INSERT INTO user (username, email) VALUES ('test', 'test@example.com');
而无需编写任何SQL。
同样,可以按如下方式检索用户:
$user = $entityManager->getRepository('User')->findOneByUsername('test')
$user = $entityManager->getRepository('User')->findOneByEmail('test@example.com')
根据用户表中的字段自动为您生成这些查找程序方法,帮助您保持代码DRY。
答案 1 :(得分:-1)
适应最终用户想要获得的内容?
你在这里进入摇摇欲坠的理由。您可能希望允许最终用户访问数据库层,以便她可以准备查询。
否则你开始重新发明轮子。而且我怀疑你真的拥有那么多功能,说实话。
所以这在很大程度上取决于您的最终用户。如果最终用户希望做得多,请以源代码形式提供软件,以便最终用户可以根据需要修改软件。
在此之前,发布您的软件并从最终用户那里获得真实需要的功能。
对你的应用程序说ORM可能只是一个无用的开销,但你只需要在PDO之上的一些更多功能,如延迟查询和稍后重命名列名的一些功能。
$result = PDOQuery::create('* FROM config')->limit(2);
$result->orderBy('`option`');
$result->aliasNames(['option' => 'name'], $removeOther = true);
foreach ($result as $row) {
print_r($row);
}
这只是示例,代码只是将行提供为assoc数组:
Array
(
[name] => Insert Option 50e60ca17bdf4
)
Array
(
[name] => Insert Option A 50e78a79ead49
)
仅在涉及foreach时执行(例如,您可以将其传递到视图中,如果视图不需要它,则永远不会执行数据库查询)。
您可以进一步扩展它,例如定义查询的所有内容都将成为您可以传递的查询定义。
您可以使迭代器成为堆叠迭代器,以便在执行查询时可以对结果应用限制,而不是再次运行查询。什么不是。
所有这些实际上都是根据您的需求增强PDO的界面,因此您需要自己编写该组件。
它应该比上面的示例代码中概述的更加分离。