Php 表数据网关的实现与活动记录有何不同?

Php 表数据网关的实现与活动记录有何不同?,php,design-patterns,activerecord,Php,Design Patterns,Activerecord,简单地说,关于表数据网关(TDG)实现:您可以创建单独的TDG类,该类包含SQL,用于具体表的CRUD操作。因此,您的模型不是直接与数据源(例如数据库)通信,而是通过那些抽象的数据源(TDG类)通信。所以,它只是一种进行另一层抽象的方法,也是一种与数据库通信的包装器——获取和修改数据。IMHO TDG类不应包含成员,而应仅包含方法。这里有一个很好的模式,可以可视化使用。当使用TDG方法时,SQL应该从模型类移动到数据源(TDG)类。我通过TDG类从DB检索的所有数据都存储在我的模型成员中 现在,

简单地说,关于表数据网关(TDG)实现:您可以创建单独的TDG类,该类包含SQL,用于具体表的CRUD操作。因此,您的模型不是直接与数据源(例如数据库)通信,而是通过那些抽象的数据源(TDG类)通信。所以,它只是一种进行另一层抽象的方法,也是一种与数据库通信的包装器——获取和修改数据。IMHO TDG类不应包含成员,而应仅包含方法。这里有一个很好的模式,可以可视化使用。当使用TDG方法时,SQL应该从模型类移动到数据源(TDG)类。我通过TDG类从DB检索的所有数据都存储在我的模型成员中

现在,如何实现活动记录?如果我将数据访问和模型类合并到一个模型类中,那么我会实现活动记录吗?我找不到清晰的区别,也找不到这些模式在PHP中的外观以及彼此之间的区别

通常,我有一个单例数据库类,然后为每个数据库表创建单独的模型类。每个模型类都有CRUD+几个自定义(计数、平均值等)操作。有些类具有用于持久化来自CRUD或自定义操作的结果的成员-这是根据需要完成的。这种方法是否可以确定为活动记录?另外,如果我将SQL从模型类移动到TDG类,这会是表数据网关吗

来自

表数据网关:充当数据库表网关(466)的对象。一个实例处理表中的所有行

活动记录:在数据库表或视图中包装行、封装数据库访问并在该数据上添加域逻辑的对象

明显的主要区别在于,TDGs包装对表的访问并仅返回行数据,而ARs包装对表中行的访问并向其添加业务逻辑

除非您的阻抗不匹配非常低,否则最好使用TDG,因为使用AR,您的业务/域对象遵循数据库中的结构,而这通常不是您的域对象应该如何建模。一场争吵可能知道如何坚持下去,但一个人不应该知道。从长远来看,分离持久性逻辑和域逻辑更易于维护


关于Singleton DB对象,请查看。

谢谢。在实现TDG时,我可能有哪些类型的方法(和SQL查询)?我不应该把业务逻辑放在这里,但是什么可以被认为是业务逻辑的东西呢?例如,我可以在TDG类中使用诸如selectAllRows、batch update(传递数据数组)、selectAllPersonsByLastName、countAll、SelectAvg等方法(和SQL查询)吗?IMHO所有这些都应该驻留在TDG类中。business logic stuff是否表示从TDG类派生的SQL结果集进行的任何其他计算?@Centurion a TDG可能包含与表相关的所有SQL查询:插入、更新、选择(持久性逻辑)。它不应该包含处理查询结果的代码(业务逻辑)。把它放在a或a中,我明白了:)但我还有一个问题。一个表模块类映射到一个表,所以IMHO这样的表模块类可以被视为一个模型(在MVC上下文中讨论时)?那么域模型呢,什么应该被视为模型呢?一组用于具体控制器的类?另外,我刚刚开始考虑第三种模式-数据映射器。IMHO此模式与TDG非常相似,因为在这两种情况下,SQL都驻留在数据源类(在TDG“Person Gateway”中,在DM“Person Mapper”中)中,而业务逻辑驻留在模型类(“Person”)中。您如何看待差异?@Centurion抱歉,解释各种架构模式超出了评论范围。这需要太多的话。简而言之,模型就是一切不是视图或控制器的东西。域模型和数据库访问只是模型内部的层。数据映射器使用TDG,但不是TDG。数据映射器将行数据映射到域对象。查看我以前关于这个主题的一些答案: