и том же состоянии, поле key для всех строк предварительно занулено.
выполняем в цикле $a += Model::where(condition)->update(['key'=>'value'])
после выполнения цикла "а" плавает от 158 до 164 (тоесть затронуто 158-164 строки)
но если заглянуть в бд и проверить а сколько реально строк не содержит null в key то видим всегда 153.
допустим (допустим) что у нас пяток строк обновляется дважды, но с условием того что входные данные никогда не меняются, почему получаем разные выходные данные?
тестировал в максимально стерильных условиях чтобы избежать сайдэффектов насколько это возможно...
condition только одно значение выбирает на обновление или несколько?
может быть одно, может быть несколько
вот если бы было одно, то твой способ тестирование правильный, а когда несколько, то скорее всего есть пересечение выборки, и т.к. часть данных уже обновлено, update() возвращает меньше чем было выбрано на обновление.
либо я вас не понял, либо вы не правы... я пошагово выполняю действия в одном потоке. никакого рэйскондишена, никаких сторонних обращений к бд. все четко шаг за шагом. на каждой итерации цикла выполняется 1запрос "найди и обнови" тоесть когда мы переходим к следующей итерации - предыдущий запрос 100% выполнен и не может никак аффектить.
я имел ввиду, что разные запросы "найди" могут вернуть пересекающиеся данные, т.е. твой тест был бы верным, если бы все вызовы "найди" возвращали уникальный контент
я возможно плохо объяснил... напсевдокодим... Model::whereNotNull('key')->update(['key'=>null); $ar = [1,2,3]; $a = 0; foreach($ar as $val) { a += Model::whereHas('relationName', function($query), use ($val){ $query->where('field', $val) }) ->update(['key'=>'not null']) } тоесть каждый раз когда этот код выполняется он имеет полностью одинаковые входящие данные. всегда "выбираются" одни и те же строки и в одни и те же строки обновляются одними и теми же данными но количество затронутых строк почему то разное
ок: что выводит: Model::whereHas('relationName', function($query) use ($val){ $query->where('field', $val) })->toSql()
select * from `model` where exists (select * from `model2` where `model`.`id` = `model2`.`model_id` and `field` = ?)
и такой Sql всегда возвращает разные (непересекающиеся) данные на всем цикле обновления
такой гарантии нет у model может быть N релейшенов с model2 тоесть мы N раз можем попытаться обновить данные для конкретной model но это количество будет всегда одинаковым, так как (еще раз повторюсь) входящие данные на запуске идентичны
Обсуждают сегодня