如何自我初始化Doctrine_Record(就好像Doctrine_Query那样)?

时间:2010-10-20 13:42:29

标签: php zend-framework doctrine

我有扩展Doctrine_Record的模型,并直接映射到数据库中的一个特定记录(即给定给定id的一条记录,在类中静态硬编码。)

现在,我希望特定的记录类能够像Doctrine_Query那样初始化自己。所以,这将是正常的程序:

$query = new Doctrine_Query();
$model = $query->from('Model o')->where('id = ?', 123)->fetchOne();

我想做这样的事情

$model = new Model();

Model

const ID = 123;

//note that __construct() is used by Doctrine_Record so we need construct() without the __
public function construct()
{
    $this->id = self::ID;
    //what here??
    $this->initialize('?????');
}

为了清楚起见:我希望该对象与从查询接收的对象完全相同(相同的状态,相同的属性和关系等)。

非常感谢任何帮助:谢谢。

3 个答案:

答案 0 :(得分:1)

虽然对于相同的数据类型(即表)具有多个类实际上并不是ORM应该是什么样的,但是您可以使用列聚合继承在Doctrine中完成所需的操作。假设您使用的是Doctrine 1.2.x,您可以编写以下YML:

Vehicle:
  columns:
    brand: string(100)
    fuelType: string(100)

Car:
  inheritance:
    extends: Entity
    type: column_aggregation
    keyField: type
    keyValue: 1

Bicycle:
  inheritance:
    extends: Entity
    type: column_aggregation
    keyField: type
    keyValue: 2

现在,Vehicle表将有一个'type'列,用于确定Doctrine在您选择车辆时将实例化的类。您将有三个类:车辆,汽车和自行车。您可以为每个类提供自己的方法等,而其实例所代表的记录则驻留在同一个数据库表中。如果您使用$a = new Bicycle,Doctrine会自动为您设置类型,因此您无需处理。

答案 1 :(得分:1)

需要首先要说的是我会把常量放在课堂上。像这样:

class Application_Model_Person
{
    const ID = 1234;
}

然后,像Doctrine_Record :: fetchOne()之类的Doctrine方法总是返回模型的(新)实例,并且永远不会将数据与您调用fetchOne()的记录合并。然而,Doctrine能够将检索到的记录与另一个类合并,所以它很简单:

class Application_Model_Person extends Doctrine_Record_Abstract
{
    const ID = 1234;

    public function __construct($table = null, $isNewEntry = false)
    {
        // Calling Doctrine_Record::__construct
        parent::__construct($table, $isNewEntry);

        // Fetch the record from database with the id self::ID
        $record = $this->getTable()->fetchOne(self::ID);
        $this->merge($record);
    }
}

然后你就可以:

$model = new Application_Model_Person;
echo $model->id; // 1234

答案 2 :(得分:0)

我不认为模型实例在初始化之后可能决定挂起某个数据库条目。也就是说,你可以这样做:

<?php
class Model extends baseModel {
  public static function create($id = null)
  {
    if ($id === null) return new Model;
    return Doctrine::getTable('Model')->findeOneById($id);
  }
}

然后,您可以使用

$newModel = Model::create();

或使用

获取具有ID 14的现有ID(例如)
$newModel = Model::create(14);

或者,如果您希望123成为默认而不是新项,请声明如下函数:

  public static function create($id = 123)