За последние 24 часа нас посетили 18874 программиста и 1609 роботов. Сейчас ищут 658 программистов ...

Eloquent ORM update по условию

Тема в разделе "Laravel", создана пользователем Reken, 23 дек 2022.

Метки:
  1. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Запрос:
    Код (Text):
    1. Ofs::find($id)
    2.       ->update([
    3.                'one' => $one,
    4.                'two' => $two,
    5.       ]);
    Подскажите пожалуйста, как сделать, что если допустим $one равняется существующему значению one в таблице Ofs, то не обновлять это значение...
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    оно и не будет обновляться, если совпадает с предыдущим )))
    --- Добавлено ---
    реально MySQL отвечает 0 records updated
    --- Добавлено ---
    если я тебя не понял, то наверное потому что вопрос так сформулирован.
     
  3. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Да, я тупанул, не тот запрос написал...
    Код (Text):
    1. Ofs::find($id)
    2.       ->update([
    3.                'one' => Ofs::raw("one + $one"),
    4.                'two' => Ofs::raw("two + $two"),
    5.       ]);
    Как в этом запросе можно сделать? Если допустим $one равняется существующему значению one в таблице Ofs, то не обновлять это значение...
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    Ofs::raw("one + $one") если 0 === $one, не обновится, ты же плюсуешь чего-то там.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Reken ну добавь буквально условие в запрос и замени find() на where().
    Тогда ситуация "не найдено таких записей" не будет вызывать ошибку, а просто ничего не будет обновляться.
    Код (Text):
    1.  
    2. Ofs::where('one', '!=', $one)
    3.   ->where('id', '=', $id)
    4.   ->update(...)
    Есть разница - вызываешь ли ты метод update() у объекта типа Builder или у экземпляра модели. Понимаешь о чём я?

    методы where...() возвращают объект Builder, их можно цепочкой добавлять один-другой-третий-стопятисотый...
    метод find() заканчивает эту цепочку и возвращает объект модели (либо null).

    В любом случае, операции Eloquent порождают запросы SQL.
    В случае Model::find()->update() это два запроса
    SELECT * FROM ofd ...
    UPDATE ofd ...
    В случае Model::where()->update() объект модели не создаётся, а в базу отправляется только один запрос
    UPDATE ofd ...
     
    don.bidon и Reken нравится это.
  6. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Да, понимаю. Спасибо за разъяснения, то что нужно.