Я хотел синхронизировать массив тегов, используя 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);