gpt4 book ai didi

laravel - Eloquent 保存多对多关系而不重复

转载 作者:行者123 更新时间:2023-12-02 12:54:31 26 4
gpt4 key购买 nike

我使用的是 Laravel 5.5,产品标签 之间存在多对多关系,数据透视表包含 product_idtag_id 作为仅有的两列。

我的模型如下:

class Product extends Model
{
public function tags()
{
return $this->belongsToMany( 'App\Tag' );
}
// other code
}

class Tag extends Model
{
public function product ()
{
return $this->belongsToMany( 'App\Product' );
}

protected $fillable = [ 'slug' ];
}

标签表包含 idslug 和时间戳列。我正在尝试将从逗号分隔字符串中的表单获取的标签分配给具有以下代码的产品:

$tags_r = explode( ',', $request->tags );

$tags = [];

foreach ( $tags_r as $tag ) {
$tags[] = new Tag( [ 'slug' => strtolower( trim( $tag ) ) ] );
}

$p->tags()->saveMany( $tags );

我的问题是,当我尝试在 tags.slug 列上不受限制地保存标签时,我最终在几行上出现了重复的标签。当我将 slug 列设置为唯一以避免重复时,代码会抛出一个错误,提示约束。如何做到这一点,以便如果标签存在,则通过使用数据透视表将其分配给产品,并且仅将其添加为 tags 表中的新行(如果尚未添加)存在吗?

最佳答案

您可以使用firstOrCreate()以避免将已有的标签添加到数据库中。

foreach ( $tags_r as $tag ) {
$tags[] = Tag::firstOrCreate(['slug' => str_slug($tag)]);
}

$p->tags()->saveMany( $tags );

我还用过str_slug()而不是手动创建 slug。

关于laravel - Eloquent 保存多对多关系而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48000163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com