【问题标题】:Laravel Eloquent for relationships and whereHasLaravel Eloquent 用于关系和 whereHas
【发布时间】:2018-06-19 16:46:54
【问题描述】:

我有 2 个表客户端和客户端维护。它们使用关系连接,因此客户端模型有许多 client_maintenance 和 client_maintenance 模型属于客户端

这一切似乎都有效,但问题是当我尝试使用 eloquent 获取数据时。

客户数据库表

id | Name      
1    client 1   
2    client 2   
3    client 3   
4    client 4  

客户端维护标签

id | client_id (fk)| job          | date
1    3               something      2018-01-01
2    4               something      2017-12-23
3    4               something      2018-01-09
4    2               something      2018-01-05

查询

$date_from = '2018-01-01';
$client = $request->get('client');


$clients = Client::where('id', '=', $client)->whereHas('client_maintenance', function($query) 
    {
        $query->when($date_from, function ($q) use ($date_from) {
            return $q->whereDate('date', '>=', $date_from);
        });
    })
    ->get();

问题是,无论何时传递客户端的所有结果,都将返回。所以我得到了 client_id 4 的两个结果,即使日期为 2017 的结果不应该通过。

date_from 变量包含从前端表单传递的数据并包含有效数据,因此这不是问题,即使我像上面那样手动设置它,我也会得到相同的结果。

任何帮助都会很棒。

【问题讨论】:

  • 请提供您的客户和客户维护的模型代码

标签: laravel laravel-5 laravel-eloquent laravel-query-builder


【解决方案1】:

在where中指定关系名称

$client = Client::with(['client_maintenance' => function($q) use($date_from) {
    $q->when($date_from, function ($q) use ($date_from) {
        return $q->whereDate('client_maintenance.date', '>=', $date_from);
    });
}])
->find($id);

【讨论】:

    【解决方案2】:

    如果要过滤client_maintenance表结果,需要使用with()

    $client = Client::with(['client_maintenance' => function($q) use($date_from) {
            $q->when($date_from, function ($q) use ($date_from) {
                return $q->whereDate('date', '>=', $date_from);
            });
        }])
        ->find($id);
    

    【讨论】:

    • 虽然我没有说明要获得哪个客户,但现在这不会带回所有客户吗?
    • @craigb88 find(4) 将只返回一个客户的 ID,它将是 an object and not a collection 这与您执行此操作相同 ->where('id', '=', 4)->first()
    • 对不起,我应该说这是动态的。它来自前端的表单值。我已经更新了我的问题。
    • @craigb88 我的代码是动态的。只需使用find($client)
    • 为什么这只适用于 find 而不适用于 get?任何人都可以帮助我吗?谢了。
    猜你喜欢
    • 2020-12-23
    • 2021-05-25
    • 2021-09-05
    • 2020-10-02
    • 2022-08-19
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多