从域实体方法中检索从属/父级

时间:2009-09-09 18:34:31

标签: php model dns entity relation

如何从实体中检索从属/父对象。

$person->getAddress();

这应该从数据库中检索该人员的Address对象并将其作为对象返回。这是一个很好的方法,如果可以的话,代码应该如何。

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

人员类看起来像这样:

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方法中使用$ domain对象并将关系信息保存在Person类中吗?

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

2 个答案:

答案 0 :(得分:3)

看看Zend_Db_Table Relationships。他们可以做到这一点,甚至更多。您今天可以使用Zend_Db_Table ,而不是尝试提供自己的实现,或者您可以根据自己的问题研究Zend Framework的code进行设计决策。这是一个权威的来源。

答案 1 :(得分:2)

首先,我认为问题的标题不是很明确,其次我不是 完全确定我理解被问到的内容......在我看来,标题和帖子都应该进行编辑以便清理一下。

该帖子似乎包含5个问题(如果我可以解释):

  1. 如何从实体中检索从属/父对象?
  2. $person->getAddress()是检索a的Address对象的好方法 来自数据库的人?
  3. 如果这是一个很好的方法,那么代码会是什么样的?
  4. 在getAddress方法中使用$ domain对象是否可以?
  5. 是否可以在Person类中保留关系信息?
  6. 至于答案:

    1. 在这种情况下,$person->getAddress()似乎是一个不错的选择,你知道,这是一个很好的描述。 ; - )
    2. 我没有看到问题:人有一个地址,要获得该地址,请问该人物对象是。
    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;
          }
      }