Doctrine中的一对多连接

时间:2011-01-16 22:05:25

标签: php symfony1 doctrine one-to-many doctrine-1.2

我尝试创建一对多连接,但它的工作非常奇怪。

我怀疑类User有一个Country,而Country Country有很多Users。 但是User-> Country返回一个包含一个国家/地区的数组(Doctrine Collection,而不是Record)。

有谁知道为什么?

  • 我需要CountryUser对象,而我 知道,可以建立这样的关系 没有额外的对象。
  • 我不是 使用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,
    ));
    

    } }

1 个答案:

答案 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定义?它更容易使用和管理。