mysql - Laravel 中包含 insert into 和 where 子查询的复杂插入查询

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

我正在尝试找出使用查询生成器Eloquent进行编码的最佳方法。

在最简单的形式中,如果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

最佳答案

在 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");

有关更多信息,请参阅此处的 Laravel 文档 https://laravel.com/docs/5.7/queries#raw-expressions

关于mysql - Laravel 中包含 insert into 和 where 子查询的复杂插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49700491/

相关文章:

laravel - 为模型设置数据库?

php - 计数记录在数据库表中出现的最大次数

php - php下拉菜单有问题

Mysql Case 返回错误值

php - “隐藏”管理文件夹,使用不同的文件夹名称?

laravel - required_without 不使用其他规则

php - Laravel 查询按两个不同的日期分组

php - 商店时间表的数据库架构

postgresql - Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

php - 使用 Eloquent 选择具有值的最后一条记录