我使用Laravel 5.5并且在产品和标记之间存在多对多的关系,其中数据透视表具有product_id
和{ {1}}只有两列。
我的模型如下:
tag_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' ];
}
,id
和时间戳列。我正在尝试将带有逗号分隔字符串形式的标记分配给带有以下代码的产品:
slug
我的问题是,当我尝试在$tags_r = explode( ',', $request->tags );
$tags = [];
foreach ( $tags_r as $tag ) {
$tags[] = new Tag( [ 'slug' => strtolower( trim( $tag ) ) ] );
}
$p->tags()->saveMany( $tags );
列上没有约束的情况下保存标记时,我最终会在多行上显示重复的标记。当我将tags.slug
列设置为唯一以避免重复时,代码会引发错误,抱怨约束。
我如何制作它,以便如果标签存在,则使用数据透视表将其分配给产品,并且只在标签表中添加它作为新行,如果它没有'已经存在了?
答案 0 :(得分:4)
您可以使用firstOrCreate()
来避免将现有标记添加到数据库中。
foreach ( $tags_r as $tag ) {
$tags[] = Tag::firstOrCreate(['slug' => str_slug($tag)]);
}
$p->tags()->saveMany( $tags );
我还使用了str_slug()
而不是手动创建了slug。