Как вставить много тегов, используя внешний ключ? - PullRequest
0 голосов
/ 05 июня 2018

[отправить функцию ] [1] сообщение об ошибке при вставке функция вставки тегов ошибка при вставке в базу данных многих тегов с использованием внешнего ключа. Я получаюпроблема в массиве, невозможно вставить много тегов

 public function uploadSubmit(UploadRequest $request)
{
    $product = new Product();
    $product->name = $request['name'];
    $product->save();



    //$product = Product::create($request->all());
    foreach ($request->photos as $photo) {
        $filename = $photo->store('photos');
        ProductsPhoto::create([
            'product_id' => $product->id,
            'filename' => $filename
        ]);

    }
    $tags = array();
    $tags = array($request['tagname[]']);
    foreach ($tags as $tag) {


        ProductTag::create([
            'tag_id' => $product->id,
            'tagname' => $tag,
        ]);
    }
    $message = 'Upload successful!';
    return redirect('/upload')->with('msg' , $message);
}

[Окружающая среда и детали: [] [2]] [sql error 3]

1 Ответ

0 голосов
/ 05 июня 2018

Хорошо - так что после того, как вы узнаете немного больше о вашей текущей настройке, я думаю, что вы выиграете от ее реструктуризации до следующего:

  1. Модель 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

...