ActiveRecord и обновление множества записей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

ActiveRecord и обновление множества записей

Сообщение Bio man »

Как в моделе AR обновить множество записей?
Пример

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

public function move(array $orders)
{
}
 
в $orders массив такой структуры: position=>id, нужно для каждого id обновить position.
Как это элегантно сделать, что бы не было 100500 обновления?
Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

Re: ActiveRecord и обновление множества записей

Сообщение Bio man »

ммм, не то. там обновляются записи одним значением...
пока реализовал так:

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

public static function move(array $positions)
{
    foreach ($positions as $position => $id) {
        $model = self::findOne($id);
        $model->order = $position;
        $model->save(false);
    }
}
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: ActiveRecord и обновление множества записей

Сообщение vitalik1183 »

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

public function massIps()
    {
        $count = 0;

        if (empty($this->ipList))
            return $count;

        $data = array_map(function ($ip) {
            return $data[] = [
                IpHelper::encodeIp($ip),
                $this->servers_id,
                \Yii::$app->formatter->asDatetime('now', 'php:Y-m-d H:i:s'),
                \Yii::$app->formatter->asDatetime('now', 'php:Y-m-d H:i:s'),
            ];
        }, explode(PHP_EOL, $this->ipList));

        if (sizeof($data) > 0) {
            $count = \Yii::$app->db->createCommand()->batchInsert(self::tableName(), [
                'ip',
                'servers_id',
                'created_at',
                'updated_at',
            ], $data)->execute();
        }

        return $count;
    }
 
думаю под апдейт сами допилите.
Yii2!
Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

Re: ActiveRecord и обновление множества записей

Сообщение Bio man »

Спасибо!
Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

Re: ActiveRecord и обновление множества записей

Сообщение Bio man »

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

Re: ActiveRecord и обновление множества записей

Сообщение vitalik1183 »

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

$wpdb->query('INSERT INTO `' . PLUGIN_PREFIX_DB . 'counting` (`user_id`, `post_id`, `created_at`, `count`)
                    VALUES(' . $post->post_author . ', ' . $post_id . ', "' . date('Y-m-d') . '", ' . $count . ') ON DUPLICATE KEY UPDATE `count` = ' . $count); 
Вырвал из другого проекта кусок кода, думаю идея понятна.
Yii2!
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: ActiveRecord и обновление множества записей

Сообщение Onotole »

Любят люди костылить, не используя функционал используемого ими фреймворка...
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: ActiveRecord и обновление множества записей

Сообщение chesar »

Так а чем updateAll не подходит? Специфичное условие для строки получается?
Вот код ниже:
Отбирает завершенные транзакции.
Формируем массив id пользователей, которым надо обновить значения.
Обновляет строки для наших пользователей у которых есть product_id=3

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

$users = Transaction::find()->where(['status' => 10, 'product_id' => 3])->asArray()->all();
$users = ArrayHelper::getColumn($rows, 'user_id');
UserSubscribe::updateAll(['status' => 1], ['product_id'=>3, 'user_id' => $users]);
 
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: ActiveRecord и обновление множества записей

Сообщение vitalik1183 »

У ТС судя по всему разные значения.
Yii2!
Ответить