![](/img/trans.png)
[英]Write a sql statement to query one table based on columns in other tables?
[英]Execute a SQL query/statement conditionally based on table data
您正在寻找的是使用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系统(对象关系映射: 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之间的同一行中获取一些资金的情况下找到,然后以负资金结束,并允许您不应该进行操作。
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框架的模型部分)之间的映射。 它不是一个查询构建器本身,但它确实使用流畅的后台来构建查询。
试试这个命令
UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200
希望这将解决您的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.