Использование отношений для установки в Zend_Db_Table_Row - PullRequest
1 голос
/ 03 февраля 2009

Есть ли способ, как использовать отношения Zend_Db для установки связанных объектов? Я ищу что-то вроде следующего кода:

$contentModel = new Content();          
$categoryModel = new Category();

$category = $categoryModel->createRow();
$category->setName('Name Category 4');

$content = $contentModel->createRow();
$content->setTitle('Title 4');

$content->setCategory($category);
$content->save();

это обеспечивает небольшую библиотеку: http://code.google.com/p/zend-framework-orm/

Кто-нибудь имеет опыт с этим? Нет ли плана для чего-то подобного в ZF? Или есть что-то лучшее для использования? (Я не хочу использовать доктрину ORM или что-то внешнее)

спасибо

Ответы [ 2 ]

3 голосов
/ 27 декабря 2009

Я разработал и реализовал код табличных отношений в Zend Framework.

Внешний ключ ($content->category в вашем примере) содержит значение первичного ключа в родительской строке, на которую он ссылается. В вашем примере $category пока не содержит значения первичного ключа, поскольку вы его не сохранили (при условии, что он использует псевдоключ с автоинкрементом). Вы не можете сохранить строку $content, пока не заполните ее внешний ключ, поэтому ссылочная целостность удовлетворена:

$contentModel = new Content();                  
$categoryModel = new Category();

$category = $categoryModel->createRow();
$category->setName('Name Category 4');

$content = $contentModel->createRow();
$content->setTitle('Title 4');

// saving populates the primary key field in the Row object
$category->save();

$content->setCategory($category->category_id);
$content->save();

Бесполезно передавать объект Row в setCategory(), если в нем не заполнен первичный ключ. $content->save() завершится ошибкой, если у него нет действительного значения первичного ключа для ссылки.

Поскольку вам необходимо заполнить это поле первичного ключа в любом случае, получить доступ к полю при вызове setCategory().

не так сложно.
1 голос
/ 03 февраля 2009

Я всегда переопределяю Zend_Db_Table и Zend_Db_Table_Row и использую свои собственные подклассы. В моем классе Db_Table у меня есть:

protected $_rowClass = 'Db_Table_Row';

В моей Db_Table_Row у меня есть следующие функции __get () и __set ():

public function __get($key)
{
    $inflector = new Zend_Filter_Word_UnderscoreToCamelCase();

    $method = 'get' . $inflector->filter($key);

    if(method_exists($this, $method)) {
        return $this->{$method}();
    }

    return parent::__get($key);
}

public function __set($key, $value)
{
    $inflector = new Zend_Filter_Word_UnderscoreToCamelCase();

    $method = 'set' . $inflector->filter($key);

    if(method_exists($this, $method))
        return $this->{$method}($value);

    return parent::__set($key, $value);
}

По сути, это просто говорит классу искать методы с именами getFoo () и setFoo () или что угодно. Тогда вы можете в значительной степени создать свои собственные поля, если будете писать свою собственную логику. В вашем случае может быть:

public function setCategory($value)
{
     $this->category_id = $value->category_id;
}
...