在这个例子中,我如何分离SQL和业务逻辑


How do I seperate my SQL and Business Logic in this example?

我一直在网上寻求帮助,了解如何设计php类来分离我的业务逻辑和数据层。我已经开始设计一个我认为很酷的类,但后来发现了PDO和ADODB,并在意识到我正在重新创建轮子时有了一个愉快的瞬间。我现在的问题是,我仍然不太明白如何将逻辑和所有SQL查询分离开来。

我从DB模式中剥离了大部分内容,并放下了这两个表,因为我认为它们很容易理解。假设我有文件,它们保存在我的服务器上的路径在目录中(这些目录可以在其他目录中)。假设我需要一些基本功能,比如从我的一个文件中获取根目录,或者获取当前目录中的目录列表。

+--------------------+ +----------------+
| Files              | | Directories    |
+--------------------+ +----------------+
| id                 | | id             |
| name               | | name           |
| path               | | directory_id   |
| directory_id       | +----------------+
+--------------------+

一个设计良好的类会是这样吗:

class Files {
    public function __construct( $file_id ) {}
    public function getDirectory() {}
    public function getRootDirectory() {}
    public function getPath() {}
    public function move( $directory_id ) {}
}
class Directories {
    public function __construct( $directory_id ) {}
    public function getRootDirectory() {}
    public function move( $directory_id ) {}
    public function listContent() {}
}

我在哪里使用通过构造函数传递的ID为构造函数中的对象获取所有数据?我应该在构造函数中传递一个PDO对象吗?还是我错过了一些有价值的设计模式?所有SQL都应该硬编码在这里吗?我从PDO得到的一件事是,我可以很容易地从MySQL切换到MSSQL,但两者的SQL语法都有差异,所以不会给我带来问题吗?

我知道这些都是理论性的问题,没有一个好的答案,但我没有同事可以讨论这个问题(我说他们甚至不知道什么是设计模式,这不是开玩笑),所以我发现自己转向了网络。如果我的问题太模糊,请随意提出一个好的讨论类型的地方,我可以问这类问题,我将不胜感激:)

很难说这在多大程度上适用于您的真实世界,但您可能应该查找ORM(对象关系映射)能为您做些什么。有很多非常有用的ORM解决方案,可以让这些东西变得更简单。当然,它们并不适用于每个解决方案,但ORM可以帮助您在逻辑所属的中间层(通常)实现逻辑。

从您的评论中可以看出,如果您想让SQL与所有DMBS一起工作,我认为您可以使用一些SQL抽象层。

我建议你Zend_DB_Selecthttp://framework.zend.com/manual/en/zend.db.select.html

如果你读到它的功能,它说:

  • SQL查询的某些部分的独立于数据库的抽象