代码之家  ›  专栏  ›  技术社区  ›  Francisco Soto

Zend框架下的MVC数据设计问题

  •  2
  • Francisco Soto  · 技术社区  · 16 年前

    如果我有一个类表示在类:表关系中访问数据库中的一个表,那么我可以在一个类中隐藏表的详细信息。但是作为任何有用的应用程序,我必须查询几个表。如何使用类:表设计来适应这种情况?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Andrew Taylor    16 年前

    但是,有几种不同的方法可以实现这一点,您选择哪一种方法取决于您的环境。

    1)断开对象与数据库之间的连接

    编写与数据库表没有连接的对象。首先使数据库表正常化,然后查看应用程序的用户将如何与数据交互。将数据建模到对象,但不要将每个对象绑定到表(即使用Zend_-DB_-Table_抽象类)

    一旦建立了对象,那么就编写映射器类,将对象映射回数据库中的相关表。这些是扩展zend_db_表的类(如果适用)。

    您可以用两种方式处理连接,要么通过zend_db_table relationship功能映射连接,要么(imho更好的选择)只需使用zend_db_select在映射器类中生成相关方法。

    所以你有两个班(可能是每桌一个,但不总是)

    人 人物映射器

    在代码中,如果要处理某些对象,请创建一个新对象

    $person = new Person();
    $person->setName('andrew taylor');
    

    然后写入并将其传递给映射器以保存它:

    $personMapper = new PersonMapper();
    $pesonnMapper->save($person);
    

    或者,换一种方式:

    $personMapper = new PersonMapper();
    $person = personMapper->load(29);
    
    $person->setName('joe bloggs');
    $personMapper->save($person);
    

    下一步将是基于 SPL :

    $personList = $personMapper->loadAllMen();
    
    foreach($personList AS $person) {
    
     echo $person->getName();
    }
    

    其中$personmapper->loadallmen()是一种类似以下的方法:

    $select = $this->select();
    $select=>where('gender = "Male"');
    $zendDbRows = this->fetchAll($select);
    
    return new PersonList($zendDbRows);
    

    2)MySQL视图

    如果您有许多联接表,其中每个联接有一行,那么,您将基于订单表中的ID联接客户信息,并以只读方式(因此,您不希望通过Zend-DB-U表适配器更新任何信息),您将创建规范化的表,然后在顶部创建一个视图。该视图处理后台的连接,因此通过Zend,您会感觉到连接到一个表。

    有一些警告,MySQL视图确实存在一些性能问题(这就是为什么它在单行FK连接上最好的原因),而且它们是严格只读的。