Выполнить SQL-запрос / оператор условно на основе данных таблицы

Во-первых, взгляните на эту таблицу, в основном мне нужно ОБНОВИТЬ (+1) тикет, ГДЕ имя пользователя равно Jondoe, а деньги больше 200.

введите описание изображения здесь

Теперь я знаю, что могу выполнить 3 запроса: сначала проверить, действительно ли пользователь имеет имя Jondoe в качестве имени пользователя, затем проверить, достаточно ли у него денег и, если эти результаты верны, то ОБНОВИТЬ (+1) тикет наконец.

Я изучаю SQL и работаю над базой данных mssql. Как правильно выполнить такой условный запрос / обновление? Могу ли я избежать использования такого количества запросов?

Я также работаю с Laravel Framework, я не знаю, поставляется ли он с каким-либо «инструментом» для достижения того, что я хочу.

заранее спасибо

2

Решение

В 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). Это не сам построитель запросов, но он свободно использует фон для построения запросов.

Ссылка https://laravel.com/docs/5.0/queries

1

Другие решения

То, что вы ищете, это использовать оператор UPDATE и оператор WHERE для выделения того, что вам требуется, и именно так вы это делаете. Разберите команду через laravel, и она обновится соответственно.

UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200

2

Использование Eloquent:

\App\User::where('username','JonDoe')->where('Money','>',200)->increment('Tickets');
2

Я не специалист по 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, а затем вы заканчиваете с отрицательными деньгами и разрешаете операцию, которую вы не должны делать.

2

Попробуйте эту команду

UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200

Надеюсь, это решит вашу проблему

1
По вопросам рекламы [email protected]