Множественное обновление relation таблиц

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Множественное обновление relation таблиц

Сообщение rebu »

Есть таблицы T1 и T2. они связанны как одни ко многим через T1.id
При обновлении T1 мне надо обновить все записи в T2 для T1.id, делаю это через link - получается что на каждую запись в T2 создается INSERT. Нельзя ли обновлять за один INSERT средствами activeQuery. или только генерить sql руками и выполнять его?
Спасибо.
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

да нет мне надо удалить текущие записи и вставить новые
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

я так и делаю - на каждую запись создаю модель и линкую ее и при save выполняется один инсерт на один линк.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Множественное обновление relation таблиц

Сообщение vitalik1183 »

Код: Выделить всё

$model->unlinkAll('drugs', true);

$drugIDs = \Yii::$app->request->post('medications');
foreach (Drug::findAll($drugIDs) as $modelDrug)
    $model->link('drugs', $modelDrug);
 
Yii2!
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

ну да и в результате будет в релейшнах массив моделей Drug соответсвующий количеству значений в $_POST['medications'].
И при сейве на каждую модель будет выполнен инсерт. Условно у меня может прийти массив из 100 значение и что - 100 инсертов?
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Множественное обновление relation таблиц

Сообщение vitalik1183 »

Да, если предложите более рациональный вариант - я только ЗА!
Yii2!
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

ну вот я смотрю в сторону batchInsert и думаю через него обвязку нарисовать. пока руками запрос генерю а в будущем надо будет попробовать, если не напишут уже..
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Множественное обновление relation таблиц

Сообщение vitalik1183 »

Я показал нативный метод, насколько он эффективен это уже другой вопрос. Через 1 запрос, конечно, более продуктивно и рационально. Но увы, что то официального метода я не смог найти.
Yii2!
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Множественное обновление relation таблиц

Сообщение lynicidn »

создайте ишью на гитхаб о добавлении метода linkAll ($relationId, $models) думаю будет восстребовано
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

да на самом деле linkAll и не нужен.
при линке все равно он в массив все модели собирает. ну и проверять - если больше одной модели в ключе - то bulk insert
rebu
Сообщения: 28
Зарегистрирован: 2015.01.14, 14:13

Re: Множественное обновление relation таблиц

Сообщение rebu »

так только для удобства линкования значений массива если только...
Rim
Сообщения: 36
Зарегистрирован: 2011.12.07, 05:36

Re: Множественное обновление relation таблиц

Сообщение Rim »

Привет сообщество!
Интресует вопрос по связкам

Есть две таблицы с моделями: 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??

Спасибо!
arogachev
Сообщения: 52
Зарегистрирован: 2014.09.09, 14:32

Re: Множественное обновление relation таблиц

Сообщение arogachev »

Как минимум вот в этой строчке есть проблемы:
if((new \frontend\models\User)->getSocials()->where(['client'=>$authclient,'uid'=>$social['uid']])->count()>0){
Relation имеет смысл вызывать у конкретного пользователя, если требуется какая-то другая логика - не используйте relation вообще.
Ну и такие one linerы смотрятся нехорошо, рекомендую отрефакторить.
Мой профиль на Github
Rim
Сообщения: 36
Зарегистрирован: 2011.12.07, 05:36

Re: Множественное обновление relation таблиц

Сообщение Rim »

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();
}
 
arogachev
Сообщения: 52
Зарегистрирован: 2014.09.09, 14:32

Re: Множественное обновление relation таблиц

Сообщение arogachev »

Зачем называть переменную $create если там экземпляр модели пользователя? Такие операции лучше делать событийно, в вашем случае в afterSave() (если хотите выполнять действия после сохранения основной модели).
Мой профиль на Github
Rim
Сообщения: 36
Зарегистрирован: 2011.12.07, 05:36

Re: Множественное обновление relation таблиц

Сообщение Rim »

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();
}
 
так?
Ответить