Open DrDeath72 opened 11 years ago
Спасибо за фидбек, не могли бы вы по подробнее пояснить что именно означают "какие то хвосты". На сколько я понимаю оно и не должно пытаться записать связь в БД если она уже существует.
В любом случае еще раз спасибо и я учту этот момент.
Спасибо за фидбек, не могли бы вы по подробнее пояснить что именно означают "какие то хвосты"
Ну просто таблицу тегов почистили, а таблицу связей нет
На сколько я понимаю оно и не должно пытаться записать связь в БД если она уже существует.
Вставка то идет простой командой insert, поэтому с уникальным индексом отпадет с ошибкой
Ну просто таблицу тегов почистили, а таблицу связей нет
Спасибо, теперь ясно до конца.
Вставка то идет простой командой insert, поэтому с уникальным индексом отпадет с ошибкой
Поправлю в ближайшее время.
Еще немного напрягает момент что ->tags->add|set()->save() делает save() записи а не просто теги сохраняет... У меня Post
public function afterSave() {
$this->linkToTags();
}
зацикливает... Хотя неясно зачем саму запись пересохранять... может save должен выполнятся свой а не записи?
А по хорошему я считаю от ->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;
}
С одной стороны я согласен что save() лишний, но с другой стороны его всеравно придется вызывать если сущьность новая. Я сделаю это в виде конфига, тот кто хочет будет вызывать save() явно, а кто не хочет - все будет сохраняться автоматом. По умолчанию сделаю автоматом =)
Хотя неясно зачем саму запись пересохранять... может save должен выполнятся свой а не записи?
Это снова расчет на новую запись которой еще нет в БД. Как я уже сказал сделаю чтобы это было не обязательно.
Спасибо за полезный отзыв.
Проблема не в том как вызывать save, а в том что его вобще не надо вызывать, потому что мы не запись сохраняем, а работаем с ее тегами, которые сами должны сохранятся, удаляться без пересохранения самой модели. Я понял что у вас сначала с массивом тегов работа, а потом уже сохранение результатов, но на деле я думаю это никому не надо, большинству надо просто добавить/удалить/заменить теги сразу в базе, я пока обойдусь saveTags() чтоб не сохранять саму модель и вызывать все ее afterSave()
Я понял все о чем вы говорите. Вы совершенно правы.
Я же говорил о случае когда вы только что создали новый экземпляр модели, и в бд для нее еще не существует записи, следовательно нет возможности сохранить свзять с тегами до того как вы на самой моделе вызовите save()
Я уверен что мы друг друга поняли, я сделаю соответствующие изменения и мы их обсудим =)
Ну мне кажется никто в лоб не будет теги сохранять не убедившись что model->save() отработал
Ну мне кажется никто в лоб не будет теги сохранять не убедившись что model->save() отработал
Нууу, я вот не уверен как раз в этом =) всякое бывает =) Мне это не сложно предусмотреть =)
Ну хорошо, меня пока и мой костыль устроит :D
Так как связь тег - модель создается простым запросом, то если в таблице остались какие то хвосты и на них уникальный индекс insert отпадает... так как insert ignore и replace нет сделал пока так для себя через try catch