带插入的复杂插入查询以及Laravel中的子查询

时间:2018-04-06 20:21:11

标签: mysql laravel-5 laravel-eloquent insert-into laravel-query-builder

我正在尝试找出使用Query BuilderEloquent对此进行编码的最佳方式。

以最简单的形式,如果某个项目已在transactions表中,则应阻止插入新的购买请求。除了运行完整的原始查询之外,我没有找到任何有用的参考。

INSERT INTO `transactions` 
    (`user_id`, `item_id`, `type`, `created_at`, `updated_at`) 
SELECT 
    1, 186808, 'bought', NOW(), NOW()
WHERE
(
    SELECT 
        SUM(
            CASE 
              WHEN `type` = 'bought' THEN 1
              WHEN `type` = 'sold' THEN -1
            END
        ) 
    FROM `transactions`
    WHERE 
        (`item_id`, `user_id`) = (186808, 1)
    GROUP BY `item_id`
) = 0

1 个答案:

答案 0 :(得分:0)

在Laravel中,您可以使用DB::raw(<your_complex_query_here>)来实现。

DB::raw("INSERT INTO `transactions` 
    (`user_id`, `item_id`, `type`, `created_at`, `updated_at`) 
SELECT 
    1, 186808, 'bought', NOW(), NOW()
WHERE
(
    SELECT 
        SUM(
            CASE 
              WHEN `type` = 'bought' THEN 1
              WHEN `type` = 'sold' THEN -1
            END
        ) 
    FROM `transactions`
    WHERE 
        (`item_id`, `user_id`) = (186808, 1)
    GROUP BY `item_id`
) = 0");

有关更多信息,请参见https://laravel.com/docs/5.7/queries#raw-expressions

处的Laravel文档。