Множественное обновление relation таблиц
Множественное обновление relation таблиц
Есть таблицы T1 и T2. они связанны как одни ко многим через T1.id
При обновлении T1 мне надо обновить все записи в T2 для T1.id, делаю это через link - получается что на каждую запись в T2 создается INSERT. Нельзя ли обновлять за один INSERT средствами activeQuery. или только генерить sql руками и выполнять его?
Спасибо.
При обновлении T1 мне надо обновить все записи в T2 для T1.id, делаю это через link - получается что на каждую запись в T2 создается INSERT. Нельзя ли обновлять за один INSERT средствами activeQuery. или только генерить sql руками и выполнять его?
Спасибо.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Множественное обновление relation таблиц
да нет мне надо удалить текущие записи и вставить новые
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Множественное обновление relation таблиц
я так и делаю - на каждую запись создаю модель и линкую ее и при save выполняется один инсерт на один линк.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Множественное обновление relation таблиц
Код: Выделить всё
$model->unlinkAll('drugs', true);
$drugIDs = \Yii::$app->request->post('medications');
foreach (Drug::findAll($drugIDs) as $modelDrug)
$model->link('drugs', $modelDrug);
Yii2!
Re: Множественное обновление relation таблиц
ну да и в результате будет в релейшнах массив моделей Drug соответсвующий количеству значений в $_POST['medications'].
И при сейве на каждую модель будет выполнен инсерт. Условно у меня может прийти массив из 100 значение и что - 100 инсертов?
И при сейве на каждую модель будет выполнен инсерт. Условно у меня может прийти массив из 100 значение и что - 100 инсертов?
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Множественное обновление relation таблиц
Да, если предложите более рациональный вариант - я только ЗА!
Yii2!
Re: Множественное обновление relation таблиц
ну вот я смотрю в сторону batchInsert и думаю через него обвязку нарисовать. пока руками запрос генерю а в будущем надо будет попробовать, если не напишут уже..
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Множественное обновление relation таблиц
Я показал нативный метод, насколько он эффективен это уже другой вопрос. Через 1 запрос, конечно, более продуктивно и рационально. Но увы, что то официального метода я не смог найти.
Yii2!
Re: Множественное обновление relation таблиц
создайте ишью на гитхаб о добавлении метода linkAll ($relationId, $models) думаю будет восстребовано
Re: Множественное обновление relation таблиц
да на самом деле linkAll и не нужен.
при линке все равно он в массив все модели собирает. ну и проверять - если больше одной модели в ключе - то bulk insert
при линке все равно он в массив все модели собирает. ну и проверять - если больше одной модели в ключе - то bulk insert
Re: Множественное обновление relation таблиц
так только для удобства линкования значений массива если только...
Re: Множественное обновление relation таблиц
Привет сообщество!
Интресует вопрос по связкам
Есть две таблицы с моделями: User и UserSocials
UserSocials привязывается к User через поле user_id
Ка правильно написать, или точнее как правильно слледовать правилам написания и работы с Yii в данном случае:
так вот вопрос, как верно написать запрос на добавление пользователя??
если с самим пользователем все понятно, то как правильно записать данные в Socials??
Спасибо!
Интресует вопрос по связкам
Есть две таблицы с моделями: User и UserSocials
UserSocials привязывается к User через поле user_id
Ка правильно написать, или точнее как правильно слледовать правилам написания и работы с Yii в данном случае:
Код: Выделить всё
// провера и получение данных с соц. сетей, сортировка по массивам для создания нового пользователя
//$user = массив данных для юзера в БД
//$social = массив данных соц.сети для записи в БД
if((new \frontend\models\User)->getSocials()->where(['client'=>$authclient,'uid'=>$social['uid']])->count()>0){
// действия если найшли такую запись, тогда авторизируем
}
else{
// если мы не нашли, надо создать и авторизировать
$create = new \frontend\models\User;
$create->login = $user['login'];
$create->password = Yii::$app->getSecurity()->generateRandomString();
$create->save();
}
если с самим пользователем все понятно, то как правильно записать данные в Socials??
Спасибо!
Re: Множественное обновление relation таблиц
Как минимум вот в этой строчке есть проблемы:
Ну и такие one linerы смотрятся нехорошо, рекомендую отрефакторить.
Relation имеет смысл вызывать у конкретного пользователя, если требуется какая-то другая логика - не используйте relation вообще.if((new \frontend\models\User)->getSocials()->where(['client'=>$authclient,'uid'=>$social['uid']])->count()>0){
Ну и такие one linerы смотрятся нехорошо, рекомендую отрефакторить.
Мой профиль на Github
Re: Множественное обновление relation таблиц
То есть лучше сделать так?arogachev писал(а):Relation имеет смысл вызывать у конкретного пользователя, если требуется какая-то другая логика - не используйте relation вообще.
Ну и такие one linerы смотрятся нехорошо, рекомендую отрефакторить.
Код: Выделить всё
$create = new \frontend\models\User;
$create->login = $user['login'];
$create->password = Yii::$app->getSecurity()->generateRandomString();
if($create->save()){
$create_social = new \frontend\models\UserSocials;
$create_social->user_id = $create->id;
foreach ($social as $k=>$v){
$create_social->$k = $v;
}
$create_social->save();
}
Re: Множественное обновление relation таблиц
Зачем называть переменную $create если там экземпляр модели пользователя? Такие операции лучше делать событийно, в вашем случае в afterSave() (если хотите выполнять действия после сохранения основной модели).
Мой профиль на Github
Re: Множественное обновление relation таблиц
А можете объяснить почему я плохо написал??arogachev писал(а):Зачем называть переменную $create если там экземпляр модели пользователя? Такие операции лучше делать событийно, в вашем случае в afterSave() (если хотите выполнять действия после сохранения основной модели).
Ведь получается что при удачном сохранении данных в Users начинаем писать в UserSocials..
И если точнее приведите пример afterSave()
Насколько я понимаю надо в модель Users создать метод afterSave()
Код: Выделить всё
public function afterSave($insert,$attributes) {
parent::afterSave();
if(empty($insert)){
$this->unlinkAll('socials', true);
}
$u_social = new \frontend\models\UserSocials();
$u_social->user_id = $u->id;
foreach ($attributes as $k=>$v){
$u_social->$k = $v;
}
$u_social->save();
}