Laravel 来自 hasmany 关系值的子查询值
Laravel Subquery Value From hasmany Relation Value
我有模型
Logbook
和一个模型
LogbookEntries
Logbook hasMany
LogbookEntries 和 LogbookEntries belongsto
Logbook(虽然超出了问题的范围)。在我的 LogbookEntries
中,我有两个字段(加上其他字段):start date
和 end_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
如果我说show all which have a follow-up date,那么只会显示条目3。我的问题是:
Logbook::whereHas('LogbookEntries', function($q) {
$q->where('start_date', <???.end_date + 1 day>)
})
这对我有用:
如果我正确理解你的问题,那么我认为最简单的方法是使用以下方法:
Note the use of whereraw instead of where so that we can use direct
mySql code
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",
},
],
}
我有模型
Logbook
和一个模型
LogbookEntries
Logbook hasMany
LogbookEntries 和 LogbookEntries belongsto
Logbook(虽然超出了问题的范围)。在我的 LogbookEntries
中,我有两个字段(加上其他字段):start date
和 end_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
如果我说show all which have a follow-up date,那么只会显示条目3。我的问题是:
Logbook::whereHas('LogbookEntries', function($q) {
$q->where('start_date', <???.end_date + 1 day>)
})
这对我有用:
如果我正确理解你的问题,那么我认为最简单的方法是使用以下方法:
Note the use of whereraw instead of where so that we can use direct mySql code
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",
},
],
}