为具有外键关系的模型构建JSON的最佳实践?

0ejtzxu1  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(77)

**Hello!**我正在使用Laravel和VueJS开发一个mono-repo,它对包含外键的表进行CRUD操作。

我发现很难为我的JSON提出一个模式或结构。我已经查阅了不同的资源,但没有太多的运气。

**这里有一个例子,希望能传达我的问题:**例如,表users有列language_id,它将其绑定到languages表。

假设用户正在填写多个表单,其中一个表单中他们从带有语言ID的表单中选择自己的语言。
由于我的User模型具有语言关系和$fillable属性language_id,所以似乎我总是需要PUT/POST API负载来匹配模型/表,如下所示:

// POST/PUT payload
{
   language_id: 3,        // foreign key column
   first_name: 'Fred',    // string column
}

字符串
但是,对于前端的其他目的,我想知道该用户资源的语言名称。所以我的另一个选择是让我的UserResourceStoreUserRequest文件如下所示:

// UserResource/StoreUserRequest/JSON format
{
   language: {
      id: 3,             // $this->language_id
      name: 'English',   // $this->language->name
   },
   first_name: 'Fred',
}


如果我采用这种方法,似乎我需要在POST或PUT中将数据传递回后端之前修改数据的结构。
另一种选择是向UserResource文件添加新字段,其中包含我需要的信息。

{
   language_id: 3,        // $this->language_id
   language: 'English',   // $this->language->name
   first_name: 'Fred',    // $this->first_name
}


但我不确定这是否是一个好的方法。我正在做一个我认为是中等规模的项目(100多张table),并希望听到大家的想法!谢谢!
我试着用搜索引擎来寻找答案,但我得到的最好的答案是“这取决于”。我不知道如何更好地描述我的问题。

c86crjj0

c86crjj01#

您的最佳实践是用途:

{
   language: {
      id: 3,             // $this->language->id
      name: 'English',   // $this->language->name
   },
   language_id:3, // $this->language_id
   first_name: 'Fred', // $this->first_name
}

字符串
当你熟悉Laravel的关系时,你会发现它是多么容易。不考虑Laravel,而只是在JSON API中,当处理链接在一起的不同对象时(这里是一个用户和一个语言)你不应该在同一个级别上混合它们的参数。我给予另一个更深入的例子。Fred现在有一个父亲:Peter和Peter讲的语言与Fred相同(但显然可以不同)。Peter的完整JSON应该是:

{
   first_name: 'Peter', // 
   id: 12,
   parent_id: null, // $this->parent_id (forgive me but i assume their is only one parent for the example and here peter do not have parent)
   language: {
      id: 3,             // $this->language->id
      name: 'English',   // $this->language->name
   },
   children: [{
      language: {
         id: 3,             // $this->children[0]->language->id
         name: 'English',   // $this->children[0]->language->name
      },
      language_id: 3, // $this->language_id
      first_name: 'Fred', // $this->first_name
      parent_id: 12, // $this->children[0]->parent_id
      id: 23 // $this->children[0]->id
   }]
}


这样做的目的是隔离每个对象,以保持代码的干净,并更容易重用它。
另一方面,如果你正在开发一个非常具体的用例,它不会进化,甚至以后也不会被其他用例使用,你可以使用一种不那么干净的方法,将每个元素分派到同一个级别上。但是请记住,大多数时候,进化的东西都是作为不会进化的东西开发的(可悲的是......)。实际上,你可以但不应该这样做。

相关问题