помочь с созданием моделей из базы данных для многих в доктрине - PullRequest
1 голос
/ 19 апреля 2010

я использую доктрину, и я настроил несколько тестовых таблиц для генерации в моделях:

Я хочу модели отношений «многие ко многим» (3 таблицы преобразованы в 3 модели)

(все упрощено, чтобы прояснить суть)

MySQL таблиц:

user:
id INT // primary key
name VARCHAR

group:
id INT // primary key
name VARCHAR

user_group:
user_id INT // primary and foreign key to user.id
group_id INT // primary and foreign key to group.id

Я думал, что он сгенерирует эти модели (из документации):

// User.php

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('id');

        $this->hasColumn('name');
    }

    public function setUp()
    {
        $this->hasMany('Group' as 'Groups', array(
                'refClass' => 'UserGroup',
                'local' => 'user_id',
                'foreign' => 'group_id'
            )
        );
    }
}

// Group.php

class Group extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('id');

        $this->hasColumn('name');
    }

    public function setUp()
    {
        $this->hasMany('User' as 'Users', array(
                'refClass' => 'UserGroup',
                'local' => 'group_id',
                'foreign' => 'user_id'
            )
        );
    }
}

// UserGroup.php

class UserGroup extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('user_id')
        );

        $this->hasColumn('group_id')
        );
    }
}

но это породило это:

// User.php

abstract class BaseUser extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('id');

        $this->hasColumn('name');
    }

    public function setUp()
    {
        $this->hasMany('UserGroup', array(
             'local' => 'id',
             'foreign' => 'user_id'));
    }
}

// Group.php

abstract class BaseGroup extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('id');

        $this->hasColumn('name');
    }

    public function setUp()
    {
        $this->hasMany('UserGroup', array(
             'local' => 'id',
             'foreign' => 'group_id'));
    }
}

// UserGroup.php

abstract class BaseUserGroup extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('user_id');

        $this->hasColumn('group_id');
    }

    public function setUp()
    {
        $this->hasOne('User', array(
             'local' => 'user_id',
             'foreign' => 'id'));

        $this->hasOne('Group', array(
             'local' => 'group_id',
             'foreign' => 'id'));
    }
}

Как видите, в моделях «Пользователь» и «Группа» отсутствует «refClass», указывающий на «Группу пользователей». в этом случае таблица «UserGroup» - это просто еще одна таблица с точки зрения Doctrine, а не типичная справочная таблица.

обычно, если это правильно, как первый, который вы можете сделать так:

$user = new User();
$user->group[1]->name = 'group 1';
$user->group[2]->name = 'group 2';

теперь вы не можете вызвать пользователя, связанного не напрямую с группой, а с группой пользователей.

Я проверил свои определения таблиц в mysql. Они верны. У user_group есть 2 столбца (первичные ключи и внешние ключи), каждый из которых указывает на первичный ключ пользователя или группы.

Но я хочу стандартные модели отношений «многие ко многим» в моделях Doctrine.

Буду признателен за помощь. Я изо всех сил пытался понять это в течение половины дня.

Что не так?

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 апреля 2010
Doctrine requires that Many-to-Many relationships be bi-directional. For example: both User must have many Groups and Group  must have many User.

Таким образом, вы должны добавить определение hasMany к пользовательской модели.

0 голосов
/ 09 декабря 2010

Доктрина не может отображать отношения автоматически.

Вы должны вручную заверить отношения, в основном потому, что ограничение, которое отображает отношение сильно отличаются между СУБД.

Итак, сгенерируйте YAML из БД, обновите вручную YAML, а затем генерировать модели.

С уважением,

Источник: http://groups.google.com/group/doctrine-user/browse_thread/thread/1fc3cb7ef39f4343?pli=1

...