【问题标题】:How to create Eloquent query from request with OR and AND conditions in Laravel 6?如何在 Laravel 6 中使用 OR 和 AND 条件从请求中创建 Eloquent 查询?
【发布时间】:2020-05-12 09:43:53
【问题描述】:

我将此 JSON 对象发送到 API 端点:

[
    {
        "name": "John",
        "city": "Berlin",
    },
    {
        "name": "Jack",
        "country": "USA",
    }
]

我想创建这个 SQL 查询:

SELECT * FROM users WHERE
  (`name` = "John" AND `city` = "Berlin")
  OR
  (`name` = "Jack" AND `country` = "USA");

我有一个User 模型来处理用户。

用 Laravel Eloquent 查询构建器创建这个 SQL 查询最简单的方法是什么?

【问题讨论】:

    标签: laravel eloquent laravel-6


    【解决方案1】:
    return User::orWhere(function (Builder $query) {
            return $query->where('name', 'John')->where('city', 'Berlin');
        })->orWhere(function (Builder $query) {
            return $query->where('name', 'Jack')->where('country', 'USA');
        })->get();
    

    (编辑)如果你想发送参数;

    $city = 'Berlin';
    $country = 'USA';
    
    return User::orWhere(function (Builder $query) use ($city) {
            return $query->where('name', 'John')->where('city', $city);
        })->orWhere(function (Builder $query) use ($country) {
            return $query->where('name', 'Jack')->where('country', $country);
        })->get();
    

    如果要动态生成;

    public function index()
    {
        $parameters = [
            [
                'name' => 'John',
                'city' => 'Berlin',
            ],
            [
                'name' => 'Jack',
                'country' => 'USA',
            ]
        ];
    
        $query = User::query();
    
        foreach ($parameters as $item) {
            $query->orWhere(function (Builder $query) use ($item) {
                foreach ($item as $key => $value) {
                    $query->where($key, $value);
                }
            });
        }
    
        return $query->get();
    }
    

    【讨论】:

    • 请求中的所有数据都是参数。唯一确定的一点是,如果数组有多个项目,它将是 OR 条件,并且数组项目的属性将是 AND 条件中的 OR 条件。
    • @netdjw 您希望每个单独的 json 块处于单独的 or 条件下。在该条件下,每个键/值对都将被 anded 与各自的列键/值对吗?
    • 这个答案正是你想要的@netdjw
    • @netdjw 我不确定我是否做对了,我添加了另一个可能的解决方案。
    猜你喜欢
    • 2016-12-29
    • 2020-06-27
    • 2017-09-09
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多