【问题标题】:Laravel Subquery Value From hasmany Relation Value来自hasmany关系值的Laravel子查询值
【发布时间】:2019-06-02 05:37:39
【问题描述】:

我有模特

Logbook 和一个模型 LogbookEntries

Logbook hasMany LogbookEntries 和 LogbookEntries belongsto Logbook(虽然不在问题范围内)。在我的LogbookEntries 中,我有两个字段(以及其他字段):start dateend_date。我想显示以下日期条目的所有 LogbookEntries 作为示例。

条目 1

start_date: 01 Mar 19
end_date: 05 Mar 19

条目 2

start_date: 06 Mar 19
end_date: 12 Mar 19

条目 3

start_date: 19 Jun 19
end_date: 22 Jun 19

如果我说显示所有有后续日期的,那么只有条目 3 会显示。我的问题是:

Logbook::whereHas('LogbookEntries', function($q) {
    $q->where('start_date', <???.end_date + 1 day>)
})

【问题讨论】:

  • 错误:$q->where('start_date ', ??.end_date+ 1 day>)
  • 你能澄清你的期望吗?我不明白你想要什么作为输出?您是否想要 start_date 比 end_date 早 2 天的所有条目?
  • 我想要的只是具有立即跟进日期的条目。因此,如果有一个条目的结束日期为 19 年 3 月 5 日,并且一个条目的开始日期为 19 年 3 月 6 日 - 那么它将给我 19 年 3 月 5 日,因为该条目的后续日期为 3 月 6 日
  • 为了清楚起见,您只希望查询返回 end_date 是紧随 start_date 之后的日期的条目?所以 start_date 01 Jan 2019 end_date 02 Jan 2019 将被返回,但 start_date 01 Jan 2019 end_date 03 Jan 2019 不会被返回?
  • 是的,这就是我所需要的

标签: mysql laravel subquery laravel-query-builder


【解决方案1】:

这对我有用:

如果我正确理解您的问题,那么我认为最简单的方法是使用以下方法:

注意使用 whereraw 而不是 where 以便我们可以直接使用 mysql代码

Logbook::whereHas('LogbookEntries', function($q) {
    $q->whereraw('date_format(date(end_date),"%Y-%m-%d") = date_format(date(start_date),"%Y-%m-%d") + interval 1 day')
})

我在我的系统上对此进行了测试,效果很好。但是,我的时间戳采用 Y-m-d HH:mm:ii 格式,所以我需要 date_format 来更改它们。你可能不需要这个。因此,您可能还想尝试以下方法:

Logbook::whereHas('LogbookEntries', function($q) {
    $q->whereraw('date(end_date) = date(start_date) + interval 1 day')
})

因为这样会更整洁。


基本上,我们所做的是获取 end_date 与 start_date + 1 天相同的条目。你离得很近,但不完全在那里。

我的系统,所以你可以看到它工作:

没有 whereraw 语句:

>>> Task::Select('start_date','end_date')->get();
=> Illuminate\Database\Eloquent\Collection {#3325
     all: [
       App\Task {#3307
         start_date: "2018-12-20 08:00:00",
         end_date: null,
       },
       App\Task {#3291
         start_date: "2018-12-18 00:00:00",
         end_date: "2018-12-19 00:00:00",
       },
       App\Task {#3318
         start_date: "2018-12-19 00:00:00",
         end_date: "2019-01-03 00:00:00",
       },
       App\Task {#3319
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3310
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3317
         start_date: "2018-12-20 14:43:16",
         end_date: "2018-12-21 14:43:16",
       },
       App\Task {#3316
         start_date: "2018-12-20 14:45:27",
         end_date: "2018-12-27 14:45:27",
       },
       App\Task {#3315
         start_date: "2018-12-20 14:46:48",
         end_date: "2018-12-24 14:46:48",
       },
       App\Task {#3313
         start_date: "2018-12-21 09:25:24",
         end_date: "2018-12-24 09:25:24",
       },
       App\Task {#3298
         start_date: "2019-01-02 08:10:19",
         end_date: "2019-01-16 08:10:19",
       },
     ],
   }

使用 whereraw 语句:

>>> Task::Select('start_date','end_date')->whereraw('date_format(date(end_date),"%Y-%m-%d") = date_format(date(start_dat
e),"%Y-%m-%d") + interval 1 day')->get();
=> Illuminate\Database\Eloquent\Collection {#3314
     all: [
       App\Task {#3312
         start_date: "2018-12-18 00:00:00",
         end_date: "2018-12-19 00:00:00",
       },
       App\Task {#3309
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3320
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3329
         start_date: "2018-12-20 14:43:16",
         end_date: "2018-12-21 14:43:16",
       },
     ],
   }

【讨论】:

  • 来自英格兰东北部的 Peta;我可以让你参加一些大​​事吗?是的?你。是。传奇。谢谢伙计。我可以从中工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2020-11-15
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多