jwohlfert23/laravel-sync-relations

用于从请求数据同步嵌套关系的包

5.0.0 2024-03-19 11:38 UTC

README

Laravel Sync Relations

将此代码添加到您的模型中

use Jwohlfert23/LaravelSyncRelations/SyncableTrait;
...

class Post extends Model {
    use SyncableTrait;
}

您可以在控制器中使用它,如下所示

public function update($id) {
    $post = Post::find($id);
    
    $post->saveAndSync(request()->input(), ['tags']);
}

假设以下情况

  • Post模型与tags有一个"hasMany"关系。
  • 请求数据看起来像这样
{
  "title": "My Post Title",
  "tags": [{
    "id": 1,
    "name": "My First Tag"
  }, {
     "name": "My Second Tag"
  }]
}

运行saveAndSync后,它将遍历请求中提供的2个tags。因为第一个已经存在,所以它会更新它并将名称设置为"My First Tag"。第二个不存在,所以它会使用"My Second Tag"创建它。在这个控制器处理完这个请求之后,您可以运行以下代码

Post::find($id)->tags->pluck('name')

并得到以下结果

["My First Tag", "My Second Tag"]

此包也支持"belongsToMany"和"belongsTo"关系类型。然而,对于这些,它不会更新/创建嵌套对象。它只会将现有模型与父模型关联(换句话说,对于这些关系,您必须为每个子提供主键)。

此外,您还可以运行saveAndSync(request()->input(), ['comments.author'])来进行嵌套同步。