来自hasmany关系值的laravel子查询值

fumotvh3  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(296)

我有个模特 Logbook 还有一个模特 LogbookEntries 行车日志 hasMany 日志条目和日志条目 belongsto 日志(不在问题范围之内)。在我的 LogbookEntries 我有两个字段(加上其他字段): start date 以及 end_date . 我想以下面的日期项为例显示所有日志项。
条目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>)
})
jvlzgdj9

jvlzgdj91#

这对我有用:

如果我正确理解你的问题,那么我认为实现这一点的最简单方法是:
注意使用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\格式来更改它们。你可能不需要这个。因此,您可能还需要尝试以下操作:

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

因为这样会更整洁。
基本上,我们所做的是得到结束日期与开始日期+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",
       },
     ],
   }

相关问题