Panic-Station / yii-taggable

Yii Behaviour to make any model taggable.
BSD 2-Clause "Simplified" License
10 stars 0 forks source link

Уникальные значения в таблице связи #2

Open DrDeath72 opened 11 years ago

DrDeath72 commented 11 years ago

Так как связь тег - модель создается простым запросом, то если в таблице остались какие то хвосты и на них уникальный индекс insert отпадает... так как insert ignore и replace нет сделал пока так для себя через try catch

            try {
                Yii::app()->db->createCommand()->insert(
                    $this->getRelationTable(),
                    Array(

                        $this->getRelationModelFk( false ) =>
                            $this->owner->primaryKey,

                        $this->getRelationTagFk( false ) => $tag->primaryKey
                    )
                );
            } catch(CDbException $e) {}
``
dpoltoratsky commented 11 years ago

Спасибо за фидбек, не могли бы вы по подробнее пояснить что именно означают "какие то хвосты". На сколько я понимаю оно и не должно пытаться записать связь в БД если она уже существует.

В любом случае еще раз спасибо и я учту этот момент.

DrDeath72 commented 11 years ago

Спасибо за фидбек, не могли бы вы по подробнее пояснить что именно означают "какие то хвосты"

Ну просто таблицу тегов почистили, а таблицу связей нет

На сколько я понимаю оно и не должно пытаться записать связь в БД если она уже существует.

Вставка то идет простой командой insert, поэтому с уникальным индексом отпадет с ошибкой

dpoltoratsky commented 11 years ago

Ну просто таблицу тегов почистили, а таблицу связей нет

Спасибо, теперь ясно до конца.

Вставка то идет простой командой insert, поэтому с уникальным индексом отпадет с ошибкой

Поправлю в ближайшее время.

DrDeath72 commented 11 years ago

Еще немного напрягает момент что ->tags->add|set()->save() делает save() записи а не просто теги сохраняет... У меня Post

public function afterSave() {
    $this->linkToTags();
}

зацикливает... Хотя неясно зачем саму запись пересохранять... может save должен выполнятся свой а не записи?

DrDeath72 commented 11 years ago

А по хорошему я считаю от ->save() надо избавляться совсем

->add() добавляет и сразу сохраняет связи ->remove() сразу удаляет ->set() = ->remove(all) + add()

Для себя пока добавил saveTags() копия от afterSave()


public function afterSave( $event ) {
   return parent::afterSave();
}
public function saveTags() {
        $this->loadTags();

        if ( !$this->owner->isNewRecord ) {
            $this->clearAttachedTags();
        }

        /* @var $tag CActiveRecord */
        foreach ( $this->tagsList as $tag ) {

            if ( $tag->isNewRecord ) {
                $tag->save();
            }

            try {
                Yii::app()->db->createCommand()->insert(
                    $this->getRelationTable(),
                    Array(

                        $this->getRelationModelFk( false ) =>
                            $this->owner->primaryKey,

                        $this->getRelationTagFk( false ) => $tag->primaryKey
                    )
                );
            } catch(CDbException $e) {}
        }

        return $this->owner;
    }
dpoltoratsky commented 11 years ago

С одной стороны я согласен что save() лишний, но с другой стороны его всеравно придется вызывать если сущьность новая. Я сделаю это в виде конфига, тот кто хочет будет вызывать save() явно, а кто не хочет - все будет сохраняться автоматом. По умолчанию сделаю автоматом =)

dpoltoratsky commented 11 years ago

Хотя неясно зачем саму запись пересохранять... может save должен выполнятся свой а не записи?

Это снова расчет на новую запись которой еще нет в БД. Как я уже сказал сделаю чтобы это было не обязательно.

Спасибо за полезный отзыв.

DrDeath72 commented 11 years ago

Проблема не в том как вызывать save, а в том что его вобще не надо вызывать, потому что мы не запись сохраняем, а работаем с ее тегами, которые сами должны сохранятся, удаляться без пересохранения самой модели. Я понял что у вас сначала с массивом тегов работа, а потом уже сохранение результатов, но на деле я думаю это никому не надо, большинству надо просто добавить/удалить/заменить теги сразу в базе, я пока обойдусь saveTags() чтоб не сохранять саму модель и вызывать все ее afterSave()

dpoltoratsky commented 11 years ago

Я понял все о чем вы говорите. Вы совершенно правы.

Я же говорил о случае когда вы только что создали новый экземпляр модели, и в бд для нее еще не существует записи, следовательно нет возможности сохранить свзять с тегами до того как вы на самой моделе вызовите save()

Я уверен что мы друг друга поняли, я сделаю соответствующие изменения и мы их обсудим =)

DrDeath72 commented 11 years ago

Ну мне кажется никто в лоб не будет теги сохранять не убедившись что model->save() отработал

dpoltoratsky commented 11 years ago

Ну мне кажется никто в лоб не будет теги сохранять не убедившись что model->save() отработал

Нууу, я вот не уверен как раз в этом =) всякое бывает =) Мне это не сложно предусмотреть =)

DrDeath72 commented 11 years ago

Ну хорошо, меня пока и мой костыль устроит :D