Во-первых, взгляните на эту таблицу, в основном мне нужно ОБНОВИТЬ (+1) тикет, ГДЕ имя пользователя равно Jondoe, а деньги больше 200.
Теперь я знаю, что могу выполнить 3 запроса: сначала проверить, действительно ли пользователь имеет имя Jondoe в качестве имени пользователя, затем проверить, достаточно ли у него денег и, если эти результаты верны, то ОБНОВИТЬ (+1) тикет наконец.
Я изучаю SQL и работаю над базой данных mssql. Как правильно выполнить такой условный запрос / обновление? Могу ли я избежать использования такого количества запросов?
Я также работаю с Laravel Framework, я не знаю, поставляется ли он с каким-либо «инструментом» для достижения того, что я хочу.
заранее спасибо
В Laravel есть свободный конструктор запросов, который вы можете использовать (более или менее), как показано ниже:
$affectedRows = DB::table('TableName')
->where("Username", "Jondoe")
->where("Money",">",200)
->increment("Tickets");
Вы также можете использовать $affectedRows
чтобы проверить, были ли сделаны какие-либо обновления.
Редактировать:
Если у вас есть модель пользователя (например, с именем User
) тогда вы можете использовать тот же синтаксис, но с Eloquent.
Пример:
User::where("Username", "Jondoe")
->where("Money",">",200)
->increment("Tickets");
Eloquent — это ORM (объектно-реляционная модель) Laravel, который обеспечивает отображение между реляционными базами данных и объектами PHP (то есть частью модели инфраструктуры MVC). Это не сам построитель запросов, но он свободно использует фон для построения запросов.
То, что вы ищете, это использовать оператор UPDATE и оператор WHERE для выделения того, что вам требуется, и именно так вы это делаете. Разберите команду через laravel, и она обновится соответственно.
UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200
Использование Eloquent:
\App\User::where('username','JonDoe')->where('Money','>',200)->increment('Tickets');
Я не специалист по Laravel, но, как и многие другие фреймворки, он должен иметь систему ORM (Object Relational Mapping: https://en.wikipedia.org/wiki/Object-relational_mapping ), эта система помогает вам «общаться» с базами данных объектно-ориентированным способом (с помощью таких методов, как getFirstByPrimaryKey ($ primaryKey)).
Тем не менее, я думаю, что такие системы лучше, когда вы уже знаете, как сделать это вручную.
В случае, если вы предлагаете, вы должны сначала подумать о том, что вам нужно, а затем подумать, что является лучшим подходом для достижения этого.
Что вам нужно:
Вставьте заявку для одного пользователя, если у этого пользователя больше или равно некоторому количеству.
Позвольте мне предположить, возможно, вы собираетесь вычеркнуть это количество из денежного поля после успешного создания билета, верно?
Поэтому я думаю, что мы продаем билет, и нормальные шаги должны быть:
Проверьте, зарегистрирован ли пользователь. Если он зарегистрирован, у нас, вероятно, есть идентификатор пользователя в сеансе или подобной системе. Гораздо лучше искать в индексированных числовых полях, если это возможно.
Как только у нас есть user_id, мы обновляем строку, если у этого идентификатора пользователя достаточно денег для этого действия:
// псевдокод $ userId = 12; стоимость $ = 200; $ query = "обновить пакет билета set tickets = tickets + 1, money = money- $ cost где id = '$ userId' и money> = $ cost "; $ result = $ db-> query ($ query); если ($ результат) { // строка с id = $ userId была обновлена } Еще { // Нет строки с $ userId, или деньги этой строки были меньше, чем $ cost }
При работе с денежными операциями следует учитывать, что все связанные запросы следует выполнять как транзакцию (транзакция в базе данных argot означает несколько SQL-предложений, выполненных вместе, таким образом, что в случае сбоя некоторых из них все другие возвращаются во избежание несогласованности).
Если вы разделите мое предложение на два запроса:
1) проверить, есть ли у пользователя с id = x деньги> = $ cost;
2) обновить деньги — = стоимость $;
Вы можете столкнуться с ситуацией, когда пользователь или другой автоматизированный процесс берет немного денег из одной и той же строки между шагами 1 и 2, а затем вы заканчиваете с отрицательными деньгами и разрешаете операцию, которую вы не должны делать.
Попробуйте эту команду
UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200
Надеюсь, это решит вашу проблему