Zend_Db_Table_Abstract Загрузка объединенных моделей - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть таблицы с именем:

client (id, alias) post (id, subject) 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?

РЕДАКТИРОВАТЬ

Вот что я хотел:

    $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;

Спасибо за советы, ребята, вы поставили меня на правильный путь

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

в вашем ORM_Post_Client должно быть

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

refTableClass => Имя класса родительской таблицы. Используйте класс имя, а не физическое имя таблицы SQL ( документация )

также я думаю, что ваш цикл должен быть:

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

потому что вы ищете клиентов сообщения, что означает, что сообщение является вашим rule

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

0 голосов
/ 04 февраля 2012

Это как представлено, не будет работать, честно говоря, это не имеет смысла.

$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');
    }
...