Ошибка синхронизации тегов в проекте Laravel - PullRequest
0 голосов
/ 29 апреля 2018

Я хотел синхронизировать массив тегов, используя eloquent в laravel.

Миграция моих тегов с помощью схемы сводных таблиц выглядит следующим образом:

public function up()
{
    Schema::create('tags', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
        $table->timestamps();
    });

    Schema::create('article_tag', function (Blueprint $table) {
        $table->integer('article_id');
        $table->integer('tag_id');
        $table->primary(['article_id','tag_id']);
    });
}

Я определяю отношение тегов в моей модели Article следующим образом:

public function tags()
{
    return $this->belongsToMany(Tag::class);
}

При создании тегов для любого сообщения я использую следующий код:

// Managing tags
    $tags = collect(explode(',', request('tags')))->map(function ($tag) {
        return str_slug($tag, '');
    })->unique();

    // attach tag to article
    $tags->each(function ($tag) use ($article) {
        if (!Tag::where(['name'=>$tag])->exists()) {
            Tag::create(['name' => $tag]);
        }
        $tag = Tag::where('name', $tag)->get();
        $article->tags()->attach($tag);
    });

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

// sync tag to article
$tags->each(function ($tag) use ($article) {
    if (!Tag::where(['name'=>$tag])->exists()) {
        Tag::create(['name' => $tag]);
    }
});
$article->tags()->sync($tags);

Ошибка:

SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: 'php' for column 'tag_id' at row 1 (SQL: insert into `article_tag` (`article_id`, `tag_id`) values (41, php))"

Как я могу решить эту проблему?

Обновление

Я решил проблему, используя следующий код:

   // sync tag to article
    $tags->each(function ($tag) use ($article) {
        if (!Tag::where(['name'=>$tag])->exists()) {
            Tag::create(['name' => $tag]);
        }
    });
    // this lines solve the problem
    $tags = Tag::whereIn('name', $tags)->get();

    $article->tags()->sync($tags);
...