Laravel Eloquent 用于关系和 whereHas
Laravel Eloquent for relationships and whereHas
我有 2 个表 clients & client_maintenance。它们使用关系连接,因此客户端模型 hasMany client_maintenance & client_maintenance model belongsTo client
这一切似乎都有效,但我发现问题出在我尝试使用 eloquent 获取数据时。
客户数据库Table
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 变量包含从前端表单传递的数据并包含有效数据,所以这不是问题,即使我像上面那样手动设置它,我也会得到相同的结果。
任何帮助都会很棒。
如果要过滤 client_maintenance
table 个结果,您需要使用 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);
在
中指定关系名称
$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 个表 clients & client_maintenance。它们使用关系连接,因此客户端模型 hasMany client_maintenance & client_maintenance model belongsTo client
这一切似乎都有效,但我发现问题出在我尝试使用 eloquent 获取数据时。
客户数据库Table
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 变量包含从前端表单传递的数据并包含有效数据,所以这不是问题,即使我像上面那样手动设置它,我也会得到相同的结果。
任何帮助都会很棒。
如果要过滤 client_maintenance
table 个结果,您需要使用 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);
在
中指定关系名称$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);