我有扩展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('?????');
}
为了清楚起见:我希望该对象与从查询接收的对象完全相同(相同的状态,相同的属性和关系等)。
非常感谢任何帮助:谢谢。
答案 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();
或使用
获取具有ID14
的现有ID(例如)
$newModel = Model::create(14);
或者,如果您希望123
成为默认而不是新项,请声明如下函数:
public static function create($id = 123)