2009-09-09 54 views
0

如何从实体中检索依赖/父对象。从域实体方法中检索依赖/父对象

$person->getAddress(); 

这应该从数据库中检索该人的地址对象并将其作为对象返回。这是做这件事的好方法,如果这样做可以,代码应该如何。

这样做意味着对象本身应该知道地址是它所关联的实体/值对象。 为什么我想要这种语法是因为它在表示层看起来干净。

Person类是这样的:

class Person { 
    protected $_domain = null; // domain is assigned when instantiated 
    protected $_data = array('name', 'address'); 
    protected $_relations = array(
    'address'=>array(
     'class'=>'Address' 
    ) 
); 
    protected $_retrievedRelations = array(); 
    public function getAddress() { 
    if (array_key_exists('address', $this->_relations)) { 
     if (!array_key_exists('address', $this->_retrievedRelations)) { 
     $this->_retrievedRelations['address'] = $this->_domain->getAddress($this->_data['address']); 
     } 

     return $this->_retrievedRelations['address']; 
    } 

    return $this->_data['address']; 
    } 
} 

因此,它是确定使用$域对象的方法的getAddress内,并保持相关信息的Person类?

请回答,因为我一直在寻找答案。

+0

我想你应该仔细看看伊万的答案。 Zend_Db_Table的关系部分完全是你在做什么。通过与其他类(每个文档)建立关系,你可以调用(假设你的参考规则被命名为“Address”)'$ person-> findAddress()',并且它将把与定义规则相关的关键字发送到地址域' find'方法并返回一个有效的行集。这听起来像你正在寻找什么,特别是如果你已经习惯于使用Zend_Db_Table。 – 2009-12-31 00:06:56

+0

是的,但它有急切的加载?另外我需要创建一个Table类,然后是一个Row类来存储业务逻辑。 – andho 2010-01-05 03:11:28

回答

3

看看Zend_Db_Table Relationships。他们允许这样做,等等。您可以直接使用Zend_Db_Table今天,而不是试图提出自己的实现,或者您可以研究Zend Framework的code的设计决定与您的问题。这是一个非常权威的来源。

+0

谢谢,但我一直在使用Zend_Db_Table一段时间,他们不能帮助我像使用Outlet PHP或其他ORM一样容易地抽象域。 – andho 2009-12-30 04:03:09

+0

Zend_Db_Table和ho有什么用?您的问题听起来完全覆盖了Zend_Db_Table功能。你可以随时添加更多的表格子类。我认为从头开始选择自己的解决方案是不值得的。 – 2009-12-30 07:25:05

+0

我同意伊万。虽然我不同意整个Zend_Db_Table的实现,但这是我真正选择的领域之一。 – 2009-12-31 00:11:56

2

首先我想问题的标题不是很清楚,第二我不是 完全确定我明白要问什么......在我看来,标题和帖子确实应该被编辑为清洁它有点。

的职位似乎包含5个问题(如果我可以意译):

  1. 一个人怎么会去从实体检索依赖/父对象?
  2. $person->getAddress()从数据库中检索 人的Address对象的好方法吗?
  3. 如果这是一个很好的方法来做到这一点,那么代码将是什么样子?
  4. 可以在getAddress方法内使用$ domain对象吗?
  5. 在Person类中保留关系信息可以吗?

至于答案去:

  1. 在这种情况下$person->getAddress()似乎是一个不错的选择,你知道,漂亮和描述。 ;-)
  2. 我没有看到一个问题:人HAS A地址,要得到那个地址,你问人的对象是。
  3. 给定的代码示例似乎回答了这个问题,虽然它有点混乱。我只是将地址作为成员对象,但除此之外它大部分是相同的
  4. & 5.我想说的主要是味道,优先级和设计依赖关系。真的没有一个清晰的答案。另外,我们是在争论这里的语义还是真实的生活场景?

一些代码,与答案Nr.3附和:(我无法得到它,在列表中正常工作)

class Person { 
    protected $_domain = null; // domain is assigned when instantiated 
    protected $_address;  // object 

    public function getAddress() { 
     if (!isset($this->_address)) { 
      $this->_address = $this->_domain->getAddressForPerson($this); // assuming $this contains some sort of ID 
     } 
     return $this->_address; 
    } 
}