无法找出这个问题的最佳名称,请随时纠正我。
我有以下实体:
这是它们彼此之间的关系:
因此,每条备忘录都只有很少的外国公民。问题是,修改外国公民时,备忘录不会受到影响,这意味着它应保留旧的外国公民名称。
为此,我创建了一个特殊的修订表,每次修改外国公民时,我实际上都创建了一个新修订。
以前我没有这张桌子。
此外,我还有用于转换API的API资源,以使其非常适合Web应用程序。以前,API返回的备忘录包含外国公民的收藏。对于每个实体(备忘,外国公民,外国公民修订),我都有一个资源类别。
现在我需要做的是以这种方式返回外国公民名单:
{[
id: 5 // foreign citizen id,
revision_id: 10 // foreign citizen revision id
name: 'John'
], ...}
这是以下几种的合并:
[
id:
revision_id: 10
]
和外国公民修订数据。
我可以与外国公民一起返回备忘录,对于每个公民,我都有一个名为“修订”的子集合,但是Web不需要它,并且不需要花费很多时间来修改javascript逻辑。
但是,当我需要修订列表时(例如,如果我添加一个页面,可以看到所有修订),那么我将只有由外国公民修订资源创建的常规修订数组。
这就是我的结论
class ForeignCitizenResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$data = [
'id' => $this->id,
];
// This looks like a code smell, but I couldn't figure out anything better
if ($this->pivot && $this->pivot->foreign_citizen_revision_id) {
$revision = new ForeignCitizenRevisionResource(
$this->revisions->firstWhere('id', $this->pivot->foreign_citizen_revision_id)
);
// How to add all revision attributes to $data?
// Exactly those attributes which are returned from ForeignCitizenRevisionResource
// as if I used it in a controller
}
return $data;
}
}
我不确定整个方法是否正确,但是我很确定Web端应该接收外国公民,因为它是具有修订ID的正常外国公民。在拥有修订表之前,我收到了除修订ID外的所有外国公民属性。
但是有时我需要使用纯ForeignCitizenRevisionResource
,有时我需要获取其属性并将其与其他数据合并。