雄辩可以保存多对多关系而无需重复

问题描述 投票:3回答:1

我正在使用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列设置为unique以避免重复时,代码会抛出一个抱怨约束的错误。如何使标记存在,它通过使用数据透视表分配给产品,如果它尚不存在,它只作为标记表中的新行添加?

laravel laravel-5 eloquent
1个回答
4
投票

您可以使用firstOrCreate()来避免将现有标记添加到数据库中。

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

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

我也使用str_slug()而不是手动创建slug。

© www.soinside.com 2019 - 2024. All rights reserved.