Хорошо - так что после того, как вы узнаете немного больше о вашей текущей настройке, я думаю, что вы выиграете от ее реструктуризации до следующего:
- Модель
Product
, чтобы иметь tags()
метод отношений:
public function tags(): MorphToMany
{
return $this->morphToMany(Tag::class, 'taggable');
}
Добавить промежуточную таблицу
taggable
:
php artisan make:migration create_taggables_table --create=taggables
class CreateTaggablesTable extends Migration
{
public function up()
{
Schema::create('taggables', function (Blueprint $table) {
$table->unsignedInteger('tag_id');
$table->unsignedInteger('taggable_id');
$table->string('taggable_type');
});
}
public function down()
{
Schema::dropIfExists('taggables');
}
}
Обновите контроллер, чтобы добавить новые теги, а затем свяжите их с продуктом:
public function uploadSubmit(UploadRequest $request)
{
$product = new Product;
$product->name = $request->name;
$product->save();
$photos = collect($request->photos)->map(function($photo) use ($product) {
return [
'product_id' => $product->id,
'filename' => $photo->store('photos')
];
})->toArray();
ProductsPhoto::insert($photos);
$tagsInUse = Tag::whereIn('name', $request->tagname);
if (count($request->tagname) > $tagsInUse->count()) {
$newTags = collect($request->tagname)->diff($tagsInUse->pluck('name')->values())->map(function (string $tag) {
return ['name' => $tag];
});
Tag::insert($newTags->toArray());
$tagIds = Tag::whereIn('name', $request->tagname)->pluck('id')->values();
} else {
$tagIds = $tagsInUse->pluck('id')->values();
}
$product->tags()->attach($tagIds);
return redirect('/upload')->with('msg' , 'Upload successful!');
}
И вот тест для этой настройки:
public function test()
{
factory(Tag::class)->create(['name' => 'one']);
factory(Tag::class)->create(['name' => 'two']);
factory(Tag::class)->create(['name' => 'three']);
$this->assertEquals(
['one', 'two', 'three'],
Tag::all()->pluck('name')->toArray()
);
$requestTags = new Collection(['one', 'three', 'four', 'five']);
$inUse = Tag::whereIn('name', $requestTags)->pluck('name')->values();
$newTags = collect($requestTags)->diff($inUse)->map(function(string $tag) {
return ['name' => $tag];
});
Tag::insert($newTags->toArray());
$this->assertEquals(
['one', 'two', 'three', 'four', 'five'],
Tag::all()->pluck('name')->toArray()
);
$product = factory(Product::class)->create(['name' => 'Bike']);
$this->assertEmpty($product->tags);
$tagIds = Tag::whereIn('name', $requestTags)->pluck('id')->values();
$product->tags()->attach($tagIds);
$this->assertEquals(
['one', 'three', 'four', 'five'],
$product->fresh('tags')->tags->pluck('name')->toArray()
);
}
Ссылка: https://laravel.com/docs/5.6/eloquent-relationships#many-to-many-polymorphic-relations