Отношения модели Zend Framework и доступ к связанным записям

У меня есть модель Zend Framework:

class User extends Zend_Db_Table_Abstract {
    protected $_name    = 'users';
    protected $_primary = 'id';
    protected $_dependentTables = array('UserItem');

    public function refresh($) {
        $items = $this->findDependentRowset('UserItem', 'items');
            // do stuff with each item
        print_r($items);
        die();
    }
}

У меня также есть связанная модель:

<?php
class UserItem extends Zend_Db_Table_Abstract
{
    protected $_name = 'user_items';
    protected $_referenceMap    = array(
        'items' => array(
            // user_id is the name of the field on the USER_ITEMS table
            'columns'           => 'user_id',
            'refTableClass'     => 'User',
            // id is the name of the field on the USERS table
            'refColumns'        => 'id'
        )
    );
}

?>

Я бы хотел, чтобы у меня была возможность позвонить User->refresh();, и у меня получилось бы несколько причудливых вещей. Но ошибка

 Fatal error: Call to undefined method FbUser::findDependentRowset() 

Что говорит мне о том, что, хотя я думаю, я делаю все правильно в соответствии с документацией Zend http://framework.zend.com/manual/en/zend.db.table.relationships.html Я что-то упустил.

Если это имеет значение, при первом запуске список элементов будет пустым, затем я "вставлю" целую кучу элементов - в будущих запусках я сравню все элементы и обновлю только те, которые отличаются. Хм... нет, это определенно не актуально :)


person Alex C    schedule 21.02.2011    source источник


Ответы (1)


У вас смешанные классы. У вас должно быть 2 класса для каждой сущности... EntityTable (ваш шлюз таблицы) и Entity (ваш шлюз строк). поэтому объявления классов должны выглядеть примерно так:

class User extends Zend_Db_Table_Row

class FbUser extends User

class UserTable extends Zend_Db_Table_Abstract

class UserItem extends Zend_Db_Table_Row

class UserItemTable extends Zend_Db_Table_Abstract

Классы строк — это ваши модели (или они связаны с моделями в зависимости от того, как вы хотите их связать), а не классы таблиц.

Метод findDependentRowset находится в классе Zend_Db_Table_Row, поэтому вы получаете сообщение об ошибке... вы каким-то образом расширили неправильный класс.

В некотором смысле я имею в виду, что ваши определения таблиц верны, но вы пытаетесь использовать экземпляры таблиц, такие как строки. Вы можете либо добавить/изменить использование класса, как было предложено выше, либо передать рабочий экземпляр пользователя в класс таблицы в качестве аргумента для обновления:

public function refresh(Zend_Db_Table_Row $user)
{
   $items = $user->findDependentRowset('UserItem', 'items');
   // do stuff with each item
   print_r($items);
   die();
}
person prodigitalson    schedule 21.02.2011
comment
Спасибо. Сейчас это работает, но заставляет меня думать, что может быть более элегантный способ сделать то, что я пытаюсь сделать. - person Alex C; 21.02.2011