2012-02-03 58 views
2

我有一个名为表:Zend_Db_Table_Abstract加载连接模型

客户端(ID,化名) 后(ID,主题) post_client(ID,POST_ID,CLIENT_ID)

许多客户可以加入到一个帖子。

使用Zend DB表抽象的我已经开始建立一个模型,这里是类:

ORM_Post

class ORM_Post extends Zend_Db_Table_Abstract { 

    protected $_name = 'Post'; 
    protected $_dependentTables = array('ORM_Post_Client'); 

} 

ORM_Client

class ORM_Client extends Zend_Db_Table_Abstract { 


    protected $_name = 'Client'; 
    protected $_dependentTables = array(
     'ORM_Post_Client' 
    ); 
} 

ORM_Post_Client

class ORM_Post_Client extends Zend_Db_Table_Abstract { 

    protected $_name = 'Post_Client'; 
    protected $_referenceMap = array(
     'post' => array(
      'columns'   => 'post_id', 
      'refTableClass'  => 'ORM_Post', 
      'refColumns'  => 'id' 
     ), 
     'client' => array(
      'columns'   => 'client_id', 
      'refTableClass'  => 'ORM_Post_Client', 
      'refColumns'  => 'id' 
     ) 

    ); 
} 

我希望待办事项是调用Post的实例,然后加载客户端关联以及加载客户端实例并加载所有关联的帖子。

所以我这样做:

$post = new ORM_Post(); 
    $results = $post->fetchAll(); 

    foreach ($results as $key => $result){ 
     $row = $results->current(); 
     $client = $row->findDependentRowset('ORM_Post_Client','client'); 
    } 

,我得到 参考规则“客户”未引用表ORM_Post

我有这个作战几个小时,看不到我要去哪里错了。我是否需要声明Post_Client加入客户端和发布模型?

编辑

这里是我后:

$post = new ORM_Post(); 
$results = $post->fetchAll(); 
$return = array(); 

    foreach ($results as $result){ 
     $row = $post->find($result->id)->current(); 
     $return[$result->id] = $row->toArray(); 
     $return[$result->id]['clients'] = $row->findManyToManyRowset('ORM_Client', 'ORM_Post_Client')->toArray(); 
} 

return $return; 

感谢您的意见家伙,你把我在正确的轨道上

回答

3

ORM_Post_Client应该

'client' => array(
      'columns'   => 'client_id', 
      'refTableClass'  => 'ORM_Client', //instead of ORM_Post_Client 
      'refColumns'  => 'id' 
     ) 

refTableClass =>父表的类名。使用类 名称,而不是SQL表(documentation

也是我认为的物理名称你的循环应该是:

foreach ($results as $result){ 
     $row = $results->current(); 
     $clients = $row->findDependentRowset('ORM_Post_Client','post'); 
    } 

,因为你正在寻找一个岗位,这意味着的客户帖子是您rule

$row->findDependentRowset($table, [$rule]);

+0

谢谢你发现这一点。但它不能解决问题。我得到: 参考规则“客户”未引用表ORM_Post – azz0r 2012-02-04 09:12:15

+0

也许尝试什么,我加入上述 – 2012-02-04 10:17:02

0

这所呈现将无法正常工作,但说实话,是没有意义的。

$post = new ORM_Post(); 
    $results = $post->fetchAll(); 

    foreach ($results as $key => $result){ 
     //$row is assigned to the whole fetchall result! 
     $row = $results->current(); 
     //in this context $client cannot call a dependent rowset. 
     $client = $row->findDependentRowset('ORM_Post_Client','client'); 
    } 

MMc是正确的,因为你参考表定义是不正确的,但是你的代码也有一些问题。也许尝试这样的:

$post = new ORM_Post(); 

    $results = $post->fetchAll(); 

    //unless your are going to use the 'key' for something you don't need it 
    foreach ($results as $result){ 

     //you need each row object in order to call findDependentRowset in a one to many relationship. 
     $row = $post->find($result->id)->current(); 
     //unless you have multiple rules set up for each table class pair you don't need to specify the rule. 
     $client = $row->findDependentRowset('ORM_Post_Client'); 
    } 
+0

我收到了一堆: 注意:类的对象一个Zend_Db_Table_Row不能转换成int在/用户/ - /网站/GIT/api/library/Zend/Db/Adapter/Abstract.php 853行 – azz0r 2012-02-04 09:13:06

+0

@ azz0r我做了一个编辑,我忘了指定我们要找的每个结果的属性。 $ result-> id应该工作,或者如果该属性没有定义$ result ['id']。其中id是您的表的id字段。对不起,哎呀。 – RockyFord 2012-02-04 14:07:26

+0

这真的很好解释在http://mattmccormick.ca/2010/04/24/how-to-easily-create-models-and-table-relationships-in-zend-framework/ – RockyFord 2012-02-04 14:21:00