Связь один ко многим в Учении - PullRequest
1 голос
/ 17 января 2011

Я пытался создать соединение один-ко-многим, но оно работает очень странно.

Я подозреваю, что класс User имеет одну страну, а класс Country имеет много пользователей. Но User-> Country всегда возвращает массив с одной страной (коллекция доктрин, а не запись).

Кто-нибудь знает, почему?

  • Мне нужен объект 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);
    }
    

    }

    класс Страна расширяет sfDoctrineRecord { публичная функция setTableDefinition () { $ This-> setTableName ( 'страна');

        $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 {

    открытая функция 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 Ответ

1 голос
/ 17 января 2011

Мне нужен объект 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? Его намного проще в использовании и управлении.

...