根据 table 数据有条件地执行 SQL query/statement

Execute a SQL query/statement conditionally based on table data

首先,看看这个 table,基本上我需要更新 (+1) 用户名​​等于 Jondoe 且金额大于 200 的票。

现在,我知道我可以执行 3 个查询,首先检查实际用户是否有 Jondoe 作为用户名,然后检查他是否有足够的钱,如果这些结果为真,最后更新 (+1) 一张票.

我正在学习 SQL 并且正在处理 mssql 数据库,执行这种条件 query/update 的正确方法是什么?我可以避免使用那么多查询吗?

我也在使用 laravel 框架,我不知道它是否附带任何 "tool" 来完成我想要的。

提前致谢

你要的是用UPDATE语句和WHERE语句来筛选出你需要的东西,你就是这样做的。通过laravel解析命令,它会相应更新。

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

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 是 Laravel 的 ORM(对象关系模型),它提供关系数据库和 PHP 对象(即 MVC 框架的模型部分)之间的映射。它本身不是查询构建器,但它确实在后台使用流利的语言来构建查询。

引用https://laravel.com/docs/5.0/queries

使用Eloquent:

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

试试这个命令

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

希望这能解决您的问题

我不是 Laravel 的专家,但和许多其他框架一样,它应该有一个 ORM 系统(对象关系映射:https://en.wikipedia.org/wiki/Object-relational_mapping),这个系统可以帮助你 'speak' 以面向对象的方式访问数据库(使用 getFirstByPrimaryKey( $primaryKey ) 等方法)。

这就是说,我认为当您已经知道如何手动操作时,这种系统会更好。

在你求婚的情况下,你首先要考虑你需要什么,然后再考虑什么是更好的方法来完成它。

您需要:

如果该用户拥有更多或等于某个数量,则为该用户插入一张票。

让我假设,也许您会在成功创建票证后从货币字段中删除该数量,对吗?

所以我觉得我们是在卖票,正常的步骤应该是:

  • 检查用户是否登录。如果已记录,我们可能在会话或类似系统中有用户 ID。如果可能,最好在索引数字字段中搜索。

  • 一旦我们有了 user_id,如果该用户 ID 有足够的钱来执行此操作,我们将更新该行:



    //pseudo code
        $userId = 12;
        $cost = 200;
        $query = "update ticketstable set tickets=tickets+1, money=money-$cost 
    where id='$userId' and money >= $cost";
        $result = $db->query($query);

        if($result){
          //row with id = $userId has been updated
        }else{
          //There's not a row with $userId, or that row's money was less than $cost
        }

在处理货币操作时请注意,您应该将所有相关查询作为一个事务处理(数据库中的一个事务 argot 意味着几个 sql 句子一起执行,如果一些失败,所有其他的被还原,以避免不一致)。

如果您将我的提案分为两个查询:

1) 检查 id=x 的用户是否有钱 >= $cost;

2) 更新金钱 -= $cost;

您会发现用户或其他自动化进程在步骤 1 和步骤 2 之间的同一行中拿了一些钱,然后您以负数结束,并允许执行您不应该执行的操作。