【问题标题】:Multiple Where Clause in Laravel not working as neededLaravel 中的多个 Where 子句无法按需要工作
【发布时间】:2021-10-21 07:41:20
【问题描述】:

我正在尝试从数据库中获取所有过期的列表。该表具有到期日期的三个字段,to_date_1、to_date_2、to_date_3。 date 2&3 可能有一个空值,但 date 1 总是有一个值。如果日期 3 不为空,我希望查询与日期 3 进行比较并跳过 date1 &2。如果日期 3 为空,则查询应与​​日期 2 进行比较,否则日期 1 将是到期日期。这是我的查询。

$query = Listing::query()
    ->where('vendor_id', $vendor->id)
    ->where('is_deleted', 0)->where('is_published', 1)->where('is_approved', 1)
    ->where(function ($q) {
        return $q->WhereNotNull('to_date_3')->Where('to_date_3', '<', \Carbon\Carbon::now()->format('Y-m-d'));
    })
    ->where(function ($q) {
        return $q->WhereNotNull('to_date_2')->Where('to_date_2', '<', \Carbon\Carbon::now()->format('Y-m-d'));
    })
    ->where(function ($q) {
        return $q->orWhere('to_date_1', '<', \Carbon\Carbon::now()->format('Y-m-d'));
    })
    ->orderBy('created_at', 'desc');
    $listings = $query->paginate(10);

这是一个示例数据:

id from_date_1 to_date_1 from_date_2 to_date_2 from_date_3 to_date_3
1 2021-06-10 2021-08-15 2021-08-16 2021-08-31 2021-09-01 2021-09-15
2 2021-06-25 2021-08-10 2021-08-11 2021-08-22 NULL NULL
3 2021-06-25 2021-08-20 NULL NULL NULL NULL

如果今天的日期是:21-08-2021,结果应该是记录:1 & 2

【问题讨论】:

  • 你能查一下-&gt;where(function ($q) { return $q-&gt;WhereNotNull('to_date_3')-&gt;Where('to_date_3', '&lt;', \Carbon\Carbon::now()-&gt;format('Y-m-d')); })返回什么吗?
  • 我设法将完整的查询作为 sql 获取,从逻辑上讲这是不正确的,这就是它返回 null 的原因。我更新了我的帖子
  • 尝试-&gt;toSql() 将您的查询检查为sql
  • @PavloMezhevikin,是的,查询已经在帖子中,不知何故它正在工作,但结果还不是 100% 正确。
  • 那是你想要的 SQL 吗?还是你从 Laravel 代码中得到的坏 SQL?

标签: laravel laravel-query-builder


【解决方案1】:

尝试使用orWhere

->where('is_deleted', 0)->where('is_published', 1)->where('is_approved', 1)
        ->where(function ($q) {
            return $q->WhereNotNull('to_date_3')->Where('to_date_3', '<', \Carbon\Carbon::now()->format('Y-m-d'));
        })
        ->orWhere(function ($q) {
            return $q->WhereNotNull('to_date_2')->Where('to_date_2', '<', \Carbon\Carbon::now()->format('Y-m-d'));
        })
        ->orWhere(function ($q) {
            return $q->orWhere('to_date_1', '<', \Carbon\Carbon::now()->format('Y-m-d'));
        })

更多关于parameters grouping

更新(where -> orWhere -> orWhere 给你你的sql)

【讨论】:

  • 我试过了,返回错误的结果..谢谢
  • 感谢您的帮助,但此查询无法按需要运行。如果 to_date_3 不为空,则应为过期日期,否则为 to_date_2,如果 to_date_2 为空,则过期日期应为 to_date_1 ..这是我从一开始的问题,希望您能帮助我。谢谢
【解决方案2】:

正如 Pavlo 所说,将您的查询分组到 where

 $query = Listing::query()
        ->where(function ($query) { // Wrap you code inside a where
            $query->where('vendor_id', $vendor->id)
                ->where('is_deleted', 0)->where('is_published', 1)->where('is_approved', 1)
                ->where(function ($q) {
                    return $q->WhereNotNull('to_date_3')->Where('to_date_3', '<', Carbon::now()->format('Y-m-d'));
                })
                ->where(function ($q) {
                    return $q->WhereNotNull('to_date_2')->Where('to_date_2', '<', Carbon::now()->format('Y-m-d'));
                })
                ->where(function ($q) {
                    return $q->orWhere('to_date_1', '<', Carbon::now()->format('Y-m-d'));
                });
        })
        ->orderBy('created_at', 'desc');
    $listings = $query->paginate(10);

【讨论】:

  • 试过了,我会得到 $vendor 是未定义的。我尝试了以下但结果为空。 $query = Listing::query() ->where('vendor_id', $vendor->id) ->otherwhere() ->orderBy('created_at', 'desc');
  • 删除 query() 试试看
  • @OsamaShaki 在这种情况下 function ($query) use ($vendor) 必须提供帮助
  • 这应该是WhereNotNull whereNotNull 对吧?其他人也
  • 我尝试了函数 ($query) 使用 ($vendor).. 谢谢,但查询没有返回任何内容.. 我有 2 个过期列表,但查询没有重新调整
猜你喜欢
  • 2020-09-28
  • 2018-09-05
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2013-10-29
  • 2021-12-22
相关资源
最近更新 更多