170 похожих чатов

Дано. Таблица с данными, на момент запуска команды всегда в одном

и том же состоянии, поле key для всех строк предварительно занулено.

выполняем в цикле $a += Model::where(condition)->update(['key'=>'value'])
после выполнения цикла "а" плавает от 158 до 164 (тоесть затронуто 158-164 строки)
но если заглянуть в бд и проверить а сколько реально строк не содержит null в key то видим всегда 153.

допустим (допустим) что у нас пяток строк обновляется дважды, но с условием того что входные данные никогда не меняются, почему получаем разные выходные данные?

тестировал в максимально стерильных условиях чтобы избежать сайдэффектов насколько это возможно...

10 ответов

20 просмотров

condition только одно значение выбирает на обновление или несколько?

Алексей- Автор вопроса
Egor Gruzdev
condition только одно значение выбирает на обновле...

может быть одно, может быть несколько

Алексей
может быть одно, может быть несколько

вот если бы было одно, то твой способ тестирование правильный, а когда несколько, то скорее всего есть пересечение выборки, и т.к. часть данных уже обновлено, update() возвращает меньше чем было выбрано на обновление.

Алексей- Автор вопроса
Egor Gruzdev
вот если бы было одно, то твой способ тестирование...

либо я вас не понял, либо вы не правы... я пошагово выполняю действия в одном потоке. никакого рэйскондишена, никаких сторонних обращений к бд. все четко шаг за шагом. на каждой итерации цикла выполняется 1запрос "найди и обнови" тоесть когда мы переходим к следующей итерации - предыдущий запрос 100% выполнен и не может никак аффектить.

Алексей
либо я вас не понял, либо вы не правы... я пошагов...

я имел ввиду, что разные запросы "найди" могут вернуть пересекающиеся данные, т.е. твой тест был бы верным, если бы все вызовы "найди" возвращали уникальный контент

Алексей- Автор вопроса
Egor Gruzdev
я имел ввиду, что разные запросы "найди" могут вер...

я возможно плохо объяснил... напсевдокодим... 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']) } тоесть каждый раз когда этот код выполняется он имеет полностью одинаковые входящие данные. всегда "выбираются" одни и те же строки и в одни и те же строки обновляются одними и теми же данными но количество затронутых строк почему то разное

Алексей
я возможно плохо объяснил... напсевдокодим... Mod...

ок: что выводит: Model::whereHas('relationName', function($query) use ($val){ $query->where('field', $val) })->toSql()

Алексей- Автор вопроса
Egor Gruzdev
ок: что выводит: Model::whereHas('relationName',...

select * from `model` where exists (select * from `model2` where `model`.`id` = `model2`.`model_id` and `field` = ?)

Алексей
select * from `model` where exists (select * from ...

и такой Sql всегда возвращает разные (непересекающиеся) данные на всем цикле обновления

Алексей- Автор вопроса
Egor Gruzdev
и такой Sql всегда возвращает разные (непересекающ...

такой гарантии нет у model может быть N релейшенов с model2 тоесть мы N раз можем попытаться обновить данные для конкретной model но это количество будет всегда одинаковым, так как (еще раз повторюсь) входящие данные на запуске идентичны

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта