Mysql插入记录if / where字段总和+ var< =字段中的值(laravel)

时间:2014-05-19 09:57:05

标签: mysql laravel insert sum

堆栈上的第一个问题,我真的找不到其他地方的答案

我正在制作一个票务预订系统,如果此次调用后订购的票证总数等于或小于tickettype的maxtickets值和事件的maxticketstype,我想要一个查询来创建一个ticketorder。

我有3张桌子

  1. eventsidmaxtickets
  2. tickettypesidevent_idmaxtickets
  3. ticketsordersidtickettype_idamountamount是门票数量)
  4. 我想在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,这意味着是真的,即使插入没有通过,因为查询仍然成功运行。尝试获取实际结果时,我决定做一个新的选择,看看它是否成功,并将我的返回消息基于预期插入的用户与选择相比,而不是打破我的头脑。

    感谢他们帮助了很多的评论

0 个答案:

没有答案