首先,看看这个表,基本上我需要UPDATE(+1)一个票据,其中Username等于Jondoe和Money大于200。
现在,我知道我可以执行3个查询,首先检查实际用户是否将Jondoe作为用户名,然后检查他是否有足够的资金,如果这些结果为真,则最后更新(+1)一张票。 / p>
我正在学习SQL而且我正在使用mssql数据库,这种条件查询/更新的正确方法是什么?我可以避免使用那么多查询吗?
我也在使用laravel框架,我不知道它是否带有任何“工具”来完成我想要的工作。
提前致谢
答案 0 :(得分:2)
您正在寻找的是使用UPDATE语句和WHERE语句来设置您需要的内容,这就是您的操作方法。通过laravel解析命令,它会相应更新。
UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200
答案 1 :(得分:2)
使用Eloquent:
\App\User::where('username','JonDoe')->where('Money','>',200)->increment('Tickets');
答案 2 :(得分:2)
我不是Laravel的专家,但是和其他许多框架一样,它应该有一个ORM系统(对象关系映射:https://en.wikipedia.org/wiki/Object-relational_mapping),这个系统可以帮助你以面向对象的方式“说话”数据库(使用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之间的同一行中获取一些资金,然后以负资金结束,并允许您不应该进行操作。
答案 3 :(得分:1)
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框架的模型部分)之间的映射。它不是一个查询构建器本身,但它确实使用流畅的后台来构建查询。
答案 4 :(得分:1)
尝试此命令
UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200
希望这可以解决您的问题