Laravel - 使用对象数组更新并将记录保存到数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel - 使用对象数组更新并将记录保存到数据库相关的知识,希望对你有一定的参考价值。

我想问一下在使用对象数组保存和更新数据到数据库时你们的最佳实践。

例如我有这个AoJ:

[
    {
        package_id: 1, 
        posts: [
            {id: 1, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "Post 1", price: 3000}
            {id: 2, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "Post 2", price: 3000}
            {id: 3, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "post 3", price: 3000}
            {id: 4, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "post 4", price: 3000}
        ]
    }
];

对于每个数组,我将使用新ID在数据库上创建一个新行。

这就是我想要的

如果我想删除id 3,如何更新数据?检测某些记录应从包中删除的最佳做法是什么?

目前我的解决方案是:

[
    {
        package_id: 1, 
        posts: [
            {id: 1, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "Post 1", price: 3000, remove: false}
            {id: 2, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "Post 2", price: 3000, remove: false}
            {id: 3, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "post 3", price: 3000, remove: true}
            {id: 4, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "post 4", price: 3000, remove: false}
        ]
    }
];

所以在更新package_id 1帖子时,当它看到remove: true时会删除它。

你们有什么感想?有什么建议让它更简单吗?

注意:我不能使用删除所有内容并发布新方法。因为每个package_id帖子都与其他表有关系

答案

正如我们所讨论的,让我发布一个基本的解决方案。

我们有一个Post模型

class Post extends Model{}

另一个是包模型

class Package extends Model{}

如果两者都有主键'id',

描述它们之间多对多关系的数据透视表将是

package_id,post_id组合为一个复合主键,类似于

Schema::create('package_post', function (Blueprint $table) {
            $table->unsignedInteger('package_id');
            $table->unsignedInteger('post_id');

            $table->foreign('package_id')->references('id')->on('packages')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('post_id')->references('id')->on('posts')
                ->onUpdate('cascade')->onDelete('cascade');

            $table->primary(['package_id', 'post_id']);
        }); 

根据要求,可能还有其他一些列。

这种关系就像

class Package extends Model { 

 public function posts()
    {
        return $this->belongsToMany( Post::class, 'package_post', 'package_id', 'post_id');
    }
}

 class Post extends Model { 

     public function packages()
        {
            return $this->belongsToMany( Package::class, 'package_post', 'post_id', 'package_id');
        }
    }

现在,当您想要检索或编辑它或删除它时,您可以使用attach,detach等方法。

对于检索,如果包id = 1并且您想要检索属于此包的所有帖子,您可以像检索它一样

$posts= Package::find(1)->posts;

对于插入,您可以使用

$package->posts()->attach($post->id);

更新

$package->posts()->sync([$post_id]);

如果你想将post_id 1更改为2

$package->posts()->wherePivot('post_id', 1)->sync(2);

脱离

$package->posts()->detach($post_id);

检查关系是否存在

$package->posts->contains($post_id)

以上是关于Laravel - 使用对象数组更新并将记录保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 更新语法 - 使用数组更新记录

记录来自 NAudio WaveIn 的输入,并将输出保存到字节数组

尝试将一组对象保存到 Firestore 并将其加载回来

Laravel - 从 JSON 数组创建对象以将其保存在 SQL 数据库中

从公共记录类型中获取所有记录并将其保存到设备

如何在更新 Laravel 中的记录时将表单发布数据加载到模型中