Оберни в транзакцию, чтобы с параллельных запросов не изгадили данные: PHP: PDO::beginTransaction(); $user = User::findOne(1); //..... тут какая-то логика $user->save(); PDO::commit(); И твоя AR всё верно делает, если данные не изменились, не надо UPDATE. Но если изменились, UPDATE только изменённых полей лучше, чтобы, как уже написали, трафик от PHP в MySQL лишний не гонять, PHP и MySQL могут быть на разных серверах.
я немного не так делаю PHP: $user = User::getBefore(); // теперь делаем где угодно и что угодно с $user-СВОЙСТВАМИ // после того как сделали где угодно и что угодно с $user-СВОЙСТВАМИ делаем $user = $user->getAfter(); // getAfter() содержит бработку некоторых событий и завершается $this->save(); $this->setVars(compact('user')); // полетели во вьюху никаких перекрёстных запросов после всех манипуляций с $user - свойствами, для объекта User будет выполнен только один save и только один раз ))) а ты видимо передаёшь свойства User в какие-то методы и у тебя там после каждого изменения свойства ->save() долбится? ))) или я неправильно понял про перекрёстные запросы? у меня собираются все изменения в кучу и делается один save() И ТОЛЬКО с изменёнными столбцами-свойствами и как раз раньше тут не писали про трафик, писали наоборот что нужно просто делать апдейт и ничего не вычислять и ты неправильно вырезал мой код, мой пример выглядит так PHP: $user = User::findOne(1); $user->save(); // моя AR не сделает update, вообще ничего не сделает:) $user->login = 'Test'; $user->save(); // моя AR сделает update ТОЛЬКО столбца `login`
Нет, я имел в виду, что к твоему скрипту могут 100 посетителей в секунду обращаться, в случае манипуляций с авторизованным юзером маловероятно, что будет дёргаться модель с одним и тем же id параллельно, но с другими изменяемыми данными очень даже. И это правильно.
ты типа думаешь что есть какие-то базовые таблицы и при выборке по одному айдишнику из них может косяк вылезти? я хз как-то не думал об этом даже так в базовых таблах нет динамики же, там одни и те же данные будут в AR-объектах
это не ерунда, потому что существует такое возвращаемое значение как num affected rows, количество обновленных строк. Если все поля совпали, то сервер вернёт 0. Никакой записи не произошло.