Php 如何使用策略模式使用联接从两个或多个表检索数据?

Php 如何使用策略模式使用联接从两个或多个表检索数据?,php,design-patterns,strategy-pattern,Php,Design Patterns,Strategy Pattern,我正在为一个PHP项目使用策略模式,大致如下所示。我一直在阅读,作为制定设计模式的参考 我能够使用单个表上的“插入”、“搜索”、“更新”具体策略类从数据库执行简单的插入、更新或获取 然而,当涉及到复杂的查询(如具有多个表的联接或视图)时,这些类是不够的 如何创建一个strategy类,允许我使用联接或视图从两个或多个表中检索自定义列数? 或者,我应该改用存储过程吗 目前,每个具体的策略类如下所示: interface IStrategy { public function algori

我正在为一个PHP项目使用策略模式,大致如下所示。我一直在阅读,作为制定设计模式的参考

我能够使用单个表上的“插入”、“搜索”、“更新”具体策略类从数据库执行简单的插入、更新或获取

然而,当涉及到复杂的查询(如具有多个表的联接或视图)时,这些类是不够的

如何创建一个strategy类,允许我使用联接或视图从两个或多个表中检索自定义列数? 或者,我应该改用存储过程吗

目前,每个具体的策略类如下所示:

interface IStrategy {

   public function algorithm(AbstractModel $modelObj, $tablename);

}

class InsertStrategy implements IStrategy{
   public function algorithm(AbstractModel $modelObj, $tablename){
      // construct SQL statement
      // Initialize the Database Object
      // Insert data using PDO
   }
}

我的方法是避免使用“表API”方法,并使用存储过程创建“数据API”。您也可以使用视图来支持SP

因此,与其编写CRUD,不如编写SP,为业务层提供有用的数据块。在您的SP中执行所有可以执行的过滤器、组、排序等操作,并让PHP业务层执行业务操作。您通常可以通过通常的数据访问层(或者ORM)访问所有SP


将数据准备分离到SPs后面类似于将业务层隐藏在服务后面。其原因和好处也各不相同

为什么你需要一个战略模式呢?什么样的客户需要这个?该策略用于在运行时交换算法。以上是CRUD操作,最好将它们全部包含在某种类型的TableDataGateway中。@Gordon好吧,我确实打算在需要时从客户端调用特定的策略,即插入、更新、删除,就像书中建议的那样。我不明白你说的“交换算法”是什么意思。你能用一些代码来详细说明一下吗?我已经解释过了。在这里,战略似乎不是一个可行的战略(双关语)。更确切地说,想想戈登,这个例子很有道理,而且看起来简单多了。人与人的互动方式。假设我有另一个名为User的类;那么相应的网关将是UserGateway。对吧?两者都有。如果必须访问20个表,那么可以使用20个网关。也可以将应用于所有子类型的逻辑抽象到泛型或抽象TableDateGateway中。事实上,不管怎样,这就是防止代码重复所要做的。请看一些想法。使用SP将业务逻辑移动到数据库系统中,这意味着您必须复制该逻辑,以防切换该系统。将逻辑保留在应用程序中可以使其更具可移植性,特别是当您使用DBAL时。它将繁重的数据处理(排序、分组、聚合等)移动到它所属的数据库中。您仍然需要一个业务层。唯一性、可空性和关系都是终止任何特定应用程序的数据规则。除非您专门针对多个平台,否则切换系统是一个罕见的事件。在任何情况下,SP都是所有数据库提供的功能。通过从应用程序发送适当的查询,而不是将其放入SP,您可以轻松地进行排序、分组和聚合。唯一性、可空性和关系不应泄漏到您的对象中。它们是数据库一致性的特性,而不是面向对象的特性。