Laravel - 最佳实践使用对象数组更新记录并将其保存到数据库
Laravel - Best Practice Update and Save Record to database using array of object
我想问一下你们在使用对象数组将数据保存和更新到数据库时的最佳实践。
例如我有这个 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 post 秒后,当它看到 remove: true
时,它将删除它。
大家怎么看?有什么建议可以让它更简单吗?
注意:我不能使用删除所有内容和 post 新方法。因为每个 package_id post 都与其他 table
有关系
正如我们讨论的那样,让我post一个基本的解决方案。
我们有一个 Post 模型像
class Post extends Model{}
另一个是封装模型
class Package extends Model{}
如果两者都有主键'id',
描述它们之间多对多关系的枢轴table将是
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');
}
}
现在当您想要检索它或编辑它或删除它时,您可以使用附加、分离等方法。
对于检索,如果package id = 1 并且你想检索所有属于这个包的post,你可以像
一样检索它
$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)
我想问一下你们在使用对象数组将数据保存和更新到数据库时的最佳实践。
例如我有这个 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 post 秒后,当它看到 remove: true
时,它将删除它。
大家怎么看?有什么建议可以让它更简单吗?
注意:我不能使用删除所有内容和 post 新方法。因为每个 package_id post 都与其他 table
有关系正如我们讨论的那样,让我post一个基本的解决方案。
我们有一个 Post 模型像
class Post extends Model{}
另一个是封装模型
class Package extends Model{}
如果两者都有主键'id',
描述它们之间多对多关系的枢轴table将是
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');
}
}
现在当您想要检索它或编辑它或删除它时,您可以使用附加、分离等方法。
对于检索,如果package id = 1 并且你想检索所有属于这个包的post,你可以像
一样检索它$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)