【问题标题】:Complex insert query with insert into and where subquery in LaravelLaravel 中带有 insert into 和 where 子查询的复杂插入查询
【发布时间】:2018-09-16 22:28:32
【问题描述】:

我正在尝试找出使用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

【问题讨论】:

  • 我对 Eloquent 或 QB 不是很熟悉,但如果这超出了他们的范围并且您必须使用原始查询,我不会感到惊讶。
  • 这是代码审查吗?你在问什么?您有什么问题需要帮助?
  • 我找不到有关如何执行此操作的任何参考。唯一的方法似乎只是做一个原始查询。我正在寻找有关如何在查询生成器中制定此查询的参考。

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


【解决方案1】:

在 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

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多