Laravel Eloquent for relationship andHas

时间:2018-01-10 13:38:40

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

我有两个表客户端& client_maintenance。它们是使用关系连接的,因此客户端模型具有许多client_maintenance& client_maintenance模型belongsTo客户端

这一切似乎都有用,发现问题就在于我试图用雄辩的方式获取我的数据。

客户数据库表

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年的那个结果也没有得到throguh。

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

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

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

$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);

答案 1 :(得分:0)

中指定关系名称
$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);