Отсутствие синхронизации данных из БД пр изменении

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

Отсутствие синхронизации данных из БД пр изменении

Сообщение Driver86 »

В модели Domain есть такая связь с пользователями:

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

    public function getUser() {
        return $this->hasOne(User::className(), ['id' => 'userId']);
    }
В экшене:

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

        $domains = Domain::find()->where(['userId' => 4])->all();
        foreach ($domains as $i => $domain) {
            if ($i == 0) {
                $domain->user->updateCounters(['balance' => -10]);
                echo 'UserId4 Balance: ' . $domain->user->balance . "\n";
            } elseif ($i == 1) {
                echo 'UserId4 Balance: ' . $domain->user->balance . "\n";
                exit;
            }
        }
Ожидание:
UserId4 Balance: -10
UserId4 Balance: -10
А на деле:
UserId4 Balance: -10
UserId4 Balance: 0
Хотя в БД видно, что сразу после updateCounters оно изменилось. Но ничего не изменилось в других $domain->user, хотя там указатели на одного и того же пользователя (в моём примере - с ID равным 4). Почему и как тут лучше поступить?
Спишь?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Отсутствие синхронизации данных из БД пр изменении

Сообщение futbolim »

В $domains уже прошла выборка. Почему после updateCounters в ней должно что-то поменяться?
Просто и в объекте обновите:

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

if($domain->user->updateCounters(['balance' => -10])) {
  $domain->user->balance -= 10;
}
echo 'UserId4 Balance: ' . $domain->user->balance . "\n";
Аватара пользователя
Driver86
Сообщения: 141
Зарегистрирован: 2015.04.13, 14:17

Re: Отсутствие синхронизации данных из БД пр изменении

Сообщение Driver86 »

Я думал, там чуть иначе сделано. Такой пример

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

        $object1 = (object)['var' => 0];
        $object2 = $object1;
        $object1->var += 1;
        echo $object1->var, "\n", $object2->var;
Выведет в обоих случаях 1. Объекты же всё-таки...
Не знаю, может в Yii2 это фича такая, когда по сути объекты одной и той же записи по-сути не зависят друг от друга и изменения $domains[0]->user->updateCounters(...) не затронут $domains[1]->user

P.S. Ещё можно использовать refresh() для "синхронизации" модели с базой
Спишь?
Ответить