Сохранить отношения многие ко многим - PullRequest
1 голос
/ 05 августа 2011

У меня небольшая проблема с тегами сохранения портфолио с Doctrine.У меня есть модель портфолио:

abstract class BasePortfolio extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('portfolio');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'fixed' => false,
             'unsigned' => true,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('title_esp', 'string', 250, array(
             'type' => 'string',
             'length' => 250,
             'fixed' => false,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
        $this->hasColumn('date_creation', 'date', null, array(
             'type' => 'date',
             'fixed' => false,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
    }

    public function setUp()
    {
        parent::setUp();
        $this->hasMany('Images', array(
             'local' => 'id',
             'foreign' => 'id_portfolio'));

        $this->hasMany('PortfolioHasTags', array(
             'local' => 'id',
             'foreign' => 'portfolio_id'));
    }
}

Класс PortfolioHasTags:

abstract class BasePortfolioHasTags extends Doctrine_Record
    {
        public function setTableDefinition()
        {
            $this->setTableName('portfolio_has_tags');
            $this->hasColumn('portfolio_id', 'integer', 4, array(
                 'type' => 'integer',
                 'length' => 4,
                 'fixed' => false,
                 'unsigned' => true,
                 'primary' => true,
                 'autoincrement' => false,
                 ));
            $this->hasColumn('tags_id', 'integer', 4, array(
                 'type' => 'integer',
                 'length' => 4,
                 'fixed' => false,
                 'unsigned' => false,
                 'primary' => true,
                 'autoincrement' => false,
                 ));
        }

        public function setUp()
        {
            parent::setUp();
            $this->hasOne('Portfolio', array(
                 'local' => 'portfolio_id',
                 'foreign' => 'id'));

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

и модель тегов

abstract class BaseTags extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('tags');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'fixed' => false,
             'unsigned' => false,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('title_esp', 'string', 45, array(
             'type' => 'string',
             'length' => 45,
             'fixed' => false,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
    }

    public function setUp()
    {
        parent::setUp();
        $this->hasMany('PortfolioHasTags', array(
             'local' => 'id',
             'foreign' => 'tags_id'));
    }
}

Мне нужно сохранить много тегов одного портфолио:1010 *

$portfolio = new Portfolio;
foreach($tags as $id_tag)
{
$portfolio->PortfolioHasTags[]->tags_id = $id_tag;
}

Есть лучший способ сделать это?Неверно использовать ручку, чтобы сохранить эти отношения!

1 Ответ

0 голосов
/ 13 августа 2011

Я также занимаюсь выяснением отношений Учителя со многими ко многим. Во-первых, я нашел эту страницу документации очень полезной: Объединение таблиц доктрин: многие ко многим

В Doctrine вы создаете связь через «Класс ассоциации», который в вашем коде представляет собой «BasePortfolioHasTags». Связанные классы BasePortfolio и BaseTags должны иметь отношение «многие ко многим», выраженное в их методах setup ():

    abstract class BasePortfolio extends Doctrine_Record
{
     ...

    public function setUp()
    {
        ...

        $this->hasMany('BaseTags', array(
             'local' => 'id',
             'foreign' => 'tags_id',
             'refClass' => 'BasePortfolioHasTags'));
    }
}

abstract class BaseTags extends Doctrine_Record
{
    ...

    public function setUp()
    {
        parent::setUp();
        $this->hasMany('BasePortfolio', array(
             'local' => 'id',
             'foreign' => 'portfolio_id',
             'refClass' => 'BasePortfolioHasTags'));
    }
}

Мне это сначала показалось немного запутанным, но синтаксис работает. В отличие от стандартного синтаксиса «один ко многим» или «один к одному», который напрямую связывает локальный идентификатор с внешним идентификатором, Doctrine использует локальный идентификатор класса BasePortfolio для прямой связи с локальным идентификатором класса BaseTags через отношения устанавливается в методе setUp () объекта refClass, BasePortfolioHasTags.

Как только вы настроите эту настройку, ссылка на документацию выше покажет вам, как сохранить данные.

Надеюсь, это поможет. Как я уже сказал, я также пытаюсь расшифровать этот материал.

...