1

有没有办法使用 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 或外部的东西)

谢谢

4

2 回答 2

3

我在 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();

setCategory()如果没有填充主键 ,则将Row 对象传递给它是没有用的。$content->save()如果它没有要引用的有效主键值,则会失败。

由于您在任何情况下都需要填充该主键字段,因此在调用时访问该字段并不难setCategory()

于 2009-12-27T00:29:40.397 回答
1

我总是覆盖 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;
}
于 2009-02-03T15:40:25.377 回答