在数据透视表中检索关系并手动创建特殊的API资源

时间:2019-04-09 14:16:55

标签: mysql laravel api database-design

无法找出这个问题的最佳名称,请随时纠正我。

我有以下实体:

  • 备忘录
  • 外国公民
  • 外国公民修订版

这是它们彼此之间的关系:

enter image description here

因此,每条备忘录都只有很少的外国公民。问题是,修改外国公民时,备忘录不会受到影响,这意味着它应保留旧的外国公民名称。

为此,我创建了一个特殊的修订表,每次修改外国公民时,我实际上都创建了一个新修订。

以前我没有这张桌子。

此外,我还有用于转换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,有时我需要获取其属性并将其与其他数据合并。

0 个答案:

没有答案
相关问题