【问题标题】:Laravel - Best Practice Update and Save Record to database using array of objectLaravel - 最佳实践使用对象数组更新和保存记录到数据库
【发布时间】:2019-08-01 11:15:03
【问题描述】:

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

例如我有这个 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 帖子都与其他表有关系

【问题讨论】:

  • 在我看来是偏好,这取决于包与帖子的关系,如果帖子可能属于多个包并且包有多个帖子,这将是多对多的关系,所以我将创建一个数据透视表,或者如果一个帖子不能属于多个包,我想将 package_id 作为外键存储在帖子表中。
  • @PrafullaKumarSahu 第一个是正确的。我没有考虑很多。嗯有趣。谢谢你的主意!
  • @PrafullaKumarSahu 当然。如果您可以举一个简单的例子来保存和更新多对多,那将会很有帮助。因为我的标题关于那个。大声笑
  • 好的,我会添加一个答案。

标签: php arrays database laravel eloquent-relationship


【解决方案1】:

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

我们有一个类似的 Post 模型

class Post extends Model{}

另一种是Package模型

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');
        }
    }

现在当你想检索或编辑或删除它时,你可以使用附加、分离等方法。

对于retrieve,如果package 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)

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多