堆栈上的第一个问题,我真的找不到其他地方的答案
我正在制作一个票务预订系统,如果此次调用后订购的票证总数等于或小于tickettype的maxtickets值和事件的maxticketstype,我想要一个查询来创建一个ticketorder。
我有3张桌子
events
列id
,maxtickets
tickettypes
列id
,event_id
,maxtickets
ticketsorders
列id
,tickettype_id
,amount
(amount
是门票数量)我想在1次通话中执行此操作的原因是,订单上的票证数量永远不会超过票证类型或事件的指定最大值。如果我在php中获得两笔金额而不是写,如果我的PHP计算没问题,那么在获得金额和写入新值之间会有时间,并且可能会有更多的订单而不是允许的。
也许我正在寻找错误的解决方案,也许我应该做更多的功课,任何方向都值得赞赏,一个完全有效的查询将是最棒的:)
我提到了laravel,因为它使用了雄辩的数据库查询,但我可以在需要时使用原始SQL,如果解决方案是原始SQL则没有问题。
提前谢谢!
更新:(得到了上述问题的帮助)
INSERT into ticketsorders (order_id, tickettype_id, event_id, amount)
SELECT '7', '23', '1', '10'
FROM dual
WHERE ((SELECT COALESCE(SUM(amount), 0) FROM ticketsorders WHERE tickettype_id = 23) + '10' ) <= (SELECT maxtickets from tickettypes where id = '23')
AND ((SELECT COALESCE(SUM(amount), 0) FROM ticketsorders WHERE event_id = 1) + '10' ) <= (SELECT maxtickets from events where id = '1')
LIMIT 1
只有uglieness我必须添加event_id给门票,我们在学校里知道你不应该这样做,因为它的可用throug关系事件 - &gt; tickettype-&gt; ticketsorder但是现在这使得事件对象的查询变得更加容易。 / p>
有关laravel的最终更新:
添加vars并将sql包装在原始语句中,如下所示:
$sql = "INSERT into ticketsorders (order_id, tickettype_id, event_id, amount) SELECT $order->id, $tickettype->id, $eventid, $val FROM dual WHERE ((SELECT COALESCE(SUM(amount), 0) FROM ticketsorders WHERE tickettype_id = $tickettype->id) + $val ) <= (SELECT max from tickettypes where id = $tickettype->id) AND ((SELECT COALESCE(SUM(amount), 0) FROM ticketsorders WHERE event_id = $eventid) + $val ) <= (SELECT max from events where id = $eventid) LIMIT 1";
$testupdate = DB::insert(DB::raw("$sql"));
我发现查询总是返回1,这意味着是真的,即使插入没有通过,因为查询仍然成功运行。尝试获取实际结果时,我决定做一个新的选择,看看它是否成功,并将我的返回消息基于预期插入的用户与选择相比,而不是打破我的头脑。
感谢他们帮助了很多的评论