我尝试创建一对多连接,但它的工作非常奇怪。
我怀疑类User有一个Country,而Country Country有很多Users。 但是User-> Country返回一个包含一个国家/地区的数组(Doctrine Collection,而不是Record)。
有谁知道为什么?
我不是 使用YAML格式进行Doctrine, 课程是手工制作的。
类用户扩展sfDoctrineRecord {
public function setTableDefinition()
{
$this->setTableName('user');
$this->hasColumn('id', 'integer', 5, array(
'type' => 'integer',
'primary' => true,
'unsigned' => true,
'autoincrement' => true,
'length' => 5,
));
$this->hasColumn('fbid', 'string', 40, array(
'type' => 'string',
'length' => 40,
#'notnull' => true,
#'unique' => true,
));
}
public function setUp()
{
parent::setUp();
$this->hasOne('Country', array(
'local' => 'user_id',
'foreign' => 'country_id',
'refClass' => 'CountryUser'
));
$timestampable0 = new Doctrine_Template_Timestampable(array(
));
$this->actAs($timestampable0);
}
}
class Country扩展了sfDoctrineRecord { 公共函数setTableDefinition() { $这 - > setTableName('国家&#39);
$this->hasColumn('id', 'integer', 5, array(
'type' => 'integer',
'primary' => true,
'unsigned' => true,
'autoincrement' => true,
'length' => 5,
));
$this->hasColumn('name', 'string', 10, array(
'type' => 'string',
'length' => 10,
'unique' => true,
#'notnull' => true,
));
}
public function setUp()
{
parent::setUp();
$this->hasMany('User as Users', array(
'local' => 'country_id',
'foreign' => 'user_id',
'refClass' => 'CountryUser'
));
$timestampable0 = new Doctrine_Template_Timestampable(array(
));
$this->actAs($timestampable0);
}
}
类CountryUser扩展了sfDoctrineRecord {
public function setTableDefinition(){
$this->setTableName('country_user');
$this->hasColumn('user_id', 'integer', 5, array(
'notnull' => true,
'unsigned' => true,
'length' => 5,
'type' => 'integer',
'primary' => true,
));
$this->hasColumn('country_id', 'integer', 5, array(
'type' => 'integer',
'notnull' => true,
'unsigned' => true,
'length' => 5,
'primary' => true,
));
} }
答案 0 :(得分:1)
我需要CountryUser对象,我知道, 这种关系可以不用 附加对象。
但这是你问题的答案。您可以使用refClass
将其设置为多对多,因此您在访问关系时始终需要获取Doctrine_Collection。这是它的工作原理,我不确定为什么你会期望一个对象。
如果集合中只有一个记录,你可能可以覆盖访问者只返回一个记录,但这很可能会破坏事情,因为所有东西都期望从这个访问者返回一个Doctine_Collection :
class User extends sfDoctrineRecord {
public function getCountry(
$coll = $this->_get('Country');
if($coll->count() == 1){
return $coll->getFirst();
}
else
{
return $coll;
}
}
}
真正的解决方案是使用正确的关系......
另外......如果你使用Symfony为什么在神的名字中你没有使用YAML定义?它更容易使用和管理。