【发布时间】:2018-09-01 13:05:38
【问题描述】:
背景 - 我正在创建一个系统,管理员可以在其中创建任意字段,然后将这些字段组合成一个表单。然后,用户填写此表单,针对每个字段输入的值存储在表中。但是,我计划将每个过去的值保留为表中的单独行,而不是覆盖以前的值。然后我希望能够显示在每个表单中提交的内容,但只显示最近提交的值。
问题
我有一个模型Service,它与另一个模型Field 具有belongsToMany 关系。这种关系定义为:
public function fields()
{
return $this->belongsToMany('App\Field')->withPivot('id', 'value', 'date')->withTimestamps();
}
中间表有 3 个我希望检索的值,id、value 和 date。
Service 可能有 1 个或多个 Fields,并且对于每个字段,它也可能有超过 1 个数据透视行。也就是说,单个Service/Field 配对可能在数据透视表中有多个具有不同数据透视值的条目。例如:
表字段服务
id | service_id | field_id | value | created_at
------------------------------------------------------
1 | 1 | 1 | lorem | 2018-02-01
2 | 1 | 1 | ipsum | 2018-01-01
3 | 1 | 1 | dolor | 2017-12-01
4 | 1 | 2 | est | 2018-03-10
5 | 1 | 2 | sicum | 2018-03-09
6 | 1 | 2 | hoci | 2018-03-08
我想要的是:
- 数据透视表中与
Service关联的每个Field的特定行,或 - 数据透视表中与
Service关联的每个Field的特定value。
例如 - 在上表中,我希望 ID 为 1 的 Service 在关系中有 2 个 Fields,每个 Field 都包含对应枢轴值的属性。附加的Fields 将由具有最近日期的相应数据透视表条目指定。类似于:
$service->fields()[0]->value = "lorem"
$service->fields()[1]->value = "est"
我觉得那里有一个明显的 'Laravel'ly 解决方案,但它让我望而却步......
更新
有点难以置信,这是我不了解窗口函数的另一个例子。我问了question 7 years ago,这基本上就是这个问题,但使用的是原始 MySQL。以下原始 MySQL 基本上给了我我想要的,我只是不知道如何 Laravelise:
SELECT services.name, fields.name, field_service.value, field_service.created_at, field_service.field_id
FROM field_service
INNER JOIN
(SELECT field_id, max(created_at) as ts
FROM field_service
WHERE service_id = X
GROUP BY field_id) maxt
ON (field_service.field_id = maxt.field_id and field_service.created_at = maxt.ts)
JOIN fields ON fields.id = field_service.field_id
JOIN services ON services.id = field_service.service_id
【问题讨论】:
-
您的意思是“2 个字段”而不是“3 个字段”吗?
-
看看你的意思——这只是一个例子——有任意数量的“字段”
标签: laravel laravel-5 laravel-5.6