首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel eager & whereHas

Laravel eager & whereHas
EN

Stack Overflow用户
提问于 2017-08-26 07:57:01
回答 2查看 3.3K关注 0票数 6

关于这个问题已经提出了几个问题,但没有一个问题能为这个问题提供令人满意的解释。

我运行以下查询:

代码语言:javascript
运行
复制
$return = Vacation::whereHas('dates', function ($query) use ($from, $to) {
    $query->whereBetween('start_date', [$from, $to]);
})->get();

根据查询日志,这将生成以下SQL。返回结果正确,但JOINed数据有问题。

代码语言:javascript
运行
复制
select * from `vacations` where exists (select * from `vacation_dates` where `vacations`.`id` = `vacation_dates`.`vacation_id` and `start_date` between '2017-08-01 00:00:00' and '2017-08-30 00:00:00')

由于没有JOIN,因此相关记录会在随后通过急切加载添加,约束也会丢失。

这个场景涉及到具有多个开始/停止日期的Vacations,我想检查哪些度假具有在$start$end日期范围内的start_date

如果没有出现,则不返回任何记录。

当出现一个事件时,将返回包含所有日期的Vacation,而不仅仅是约束中的日期。

我知道它是怎么做的,但我不知道如何才能获得我需要的东西:包含跟随约束的连接数据的记录。

有没有人?

EN

回答 2

Stack Overflow用户

发布于 2017-08-26 20:06:26

解决方案:

代码语言:javascript
运行
复制
$callback = function($query) use($from, $to) {
            $query->whereBetween('start_date', [$from, $to]);
        };
        $return = Vacation::whereHas('dates', $callback)->with(['dates' => $callback])->get();

Solution is from this SO post

票数 9
EN

Stack Overflow用户

发布于 2019-03-28 23:16:04

与@stef给出的答案相同,但语法更好看(我相信)

代码语言:javascript
运行
复制
$return = Vacation::query()
    ->whereHas('dates', $datesFilter = function($query) use ($from, $to) {
        $query->whereBetween('start_date', [$from, $to]);
    })
    ->with(['dates' => $datesFilter])
    ->get();
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45890719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档