Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Zend_Db和多个表_Php_Oop_Zend Framework_Zend Db - Fatal编程技术网

Php 使用Zend_Db和多个表

Php 使用Zend_Db和多个表,php,oop,zend-framework,zend-db,Php,Oop,Zend Framework,Zend Db,我有一个标准化的数据库,在互联网上存储文件的位置。一个文件可能有多个位置分布在不同的站点上。我将URL存储为两部分(Site.UrlStart、FileLocation.UrlEnd)。UrlEnd是该文件(对于站点)唯一的部分 简化的数据库结构: 我使用从Zend_Db_Table_Abstract继承的表类作为我的ORM(如果是这样的话) 问题是,检索位置数据(例如url)需要使用多个表,就我所知,我要么使用两个表类(从而暴露我的表结构),要么将sql分散到我的应用程序中,这两种方法听起来

我有一个标准化的数据库,在互联网上存储文件的位置。一个文件可能有多个位置分布在不同的站点上。我将URL存储为两部分(Site.UrlStart、FileLocation.UrlEnd)。UrlEnd是该文件(对于站点)唯一的部分

简化的数据库结构:

我使用从Zend_Db_Table_Abstract继承的表类作为我的ORM(如果是这样的话)

问题是,检索位置数据(例如url)需要使用多个表,就我所知,我要么使用两个表类(从而暴露我的表结构),要么将sql分散到我的应用程序中,这两种方法听起来都不吸引人

我能看到的唯一解决方案是创建一个类似Zend_Db_Table_Abstract(可能继承自它?)的外观,并隐藏数据实际上位于两个表上的事实

我的问题如下:

  • 我创建façade类的方向正确吗(还有其他选择吗)
  • facade类是否应该继承自
    Zend\u Db\u Table\u Abstract

除了非常简单的用例之外,Zend Db Table并不是一个真正的ORM。它意味着与系统中的每个表密切相关。因此,每个表都有一个Zend_Db_Table类

为了更好地管理全局,你需要另一种类型的课程

因此,是的,关于使用一种立面,您的立场是正确的。

但是,我不会让它从Zend_Db_Table_Abstract继承,因为它有一套非常不同的职责。

也许值得研究一下数据映射器模式——它有点像一个外表(Martin Fowler,企业架构模式)。每个“域实体类型”都有一个映射器(不一定与每个表有一个映射器相同),可能还有另一个额外的映射器,用于整个类型族

Zend Framework的简介页面上有一个简单的数据映射器模式示例:

请注意应用程序\模型\留言簿页面如何使用应用程序\模型\数据库\留言簿,而不是对其进行扩展

然而,这是一个非常简单的例子,有时会给你留下更多的问题而不是答案

另一个学习如何将数据库映射到模型的好资源是Scott Ambler的

网上文章:

这涵盖了处理数据到数据、对象到对象以及数据到对象之间关系的过程:

它还涉及到数据映射器模式,是少数几个可以很好地解释如何将类层次结构映射到db表的地方之一

Eric Evans还描述了“存储库”的使用,它是位于模型和数据层之间的外观。如果使用数据映射器制作一个成熟的ORM看起来令人望而生畏,那么这可能是一个快速的起点。通常,每个重要的域实体(即聚合根实体,“葡萄束的茎”)都有一个存储库

请参阅有关存储库的更多信息:

基本上,除了其他方法外,存储库还有一个FindById()类型的方法,它可以将三个Zend Db表对象的使用封装在其外观后面。您的模型可以立即开始使用“回购”。然后,有一天,如果你想添加更多新奇的ORM东西,你只需在回购协议的门面后面交换它,你的模型甚至不需要知道它

如果这三个表代表了具有独立生命周期的实体,那么最好有三组类来管理它们的每个生命周期。如果是这种情况,那么您将使用“服务”(特别是Eric Evans的另一种模式)来管理它们的交互。服务是放置似乎不适合任何一个独占实体的操作的地方

见:


主要的一点是从心理上脱离Zend Db Table的主导地位——它只是一个次要的玩家,是Db表的一种表现形式,仅此而已。

Zend Db Table并不是一个非常简单的用例之外的ORM。它意味着与系统中的每个表密切相关。因此,每个表都有一个Zend_Db_Table类

为了更好地管理全局,你需要另一种类型的课程

因此,是的,关于使用一种立面,您的立场是正确的。

但是,我不会让它从Zend_Db_Table_Abstract继承,因为它有一套非常不同的职责。

也许值得研究一下数据映射器模式——它有点像一个外表(Martin Fowler,企业架构模式)。每个“域实体类型”都有一个映射器(不一定与每个表有一个映射器相同),可能还有另一个额外的映射器,用于整个类型族

Zend Framework的简介页面上有一个简单的数据映射器模式示例:

请注意应用程序\模型\留言簿页面如何使用应用程序\模型\数据库\留言簿,而不是对其进行扩展

然而,这是一个非常简单的例子,有时会给你留下更多的问题而不是答案

另一个学习如何将数据库映射到模型的好资源是Scott Ambler的

网上文章:

这涵盖了处理数据到数据、对象到对象以及数据到对象之间关系的过程:

它还涉及到数据映射器模式,是少数几个可以很好地解释如何将类层次结构映射到db表的地方之一

Eric Evans还描述了“存储库”的使用,它是位于模型和数据层之间的外观。如果使用数据映射器制作一个成熟的ORM看起来令人望而生畏,那么这可能是一个快速的起点。通常,每个重要的域实体(即聚合)都有一个存储库