![](/img/trans.png)
[英]How to save array data from multiple select in Laravel using Eloquent
[英]how to save a list of tags array in database using eloquent laravel
我將在我的表格中保存帶有一些標簽的帖子,但我無法保存與此新帖子關聯的標簽列表。 我有一個博客、標簽、可標記表,如下所示。
-- auto-generated definition
create table blog
(
id int auto_increment
primary key,
title varchar(200) null,
content text null,
author varchar(200) null,
category varchar(200) null,
img_url varchar(200) null,
created_at timestamp default CURRENT_TIMESTAMP not null,
updated_at timestamp null,
deleted_at timestamp null,
user_id int not null,
category_id int null,
constraint fk18
foreign key (user_id) references users (id)
on update cascade on delete cascade,
constraint fk19
foreign key (category_id) references blog (id)
on update cascade on delete cascade
);
create index blog_index
on blog (category_id);
create index blog_users_index
on blog (user_id);
-- auto-generated definition
create table tags
(
id int auto_increment
primary key,
name varchar(200) null,
created_at timestamp default CURRENT_TIMESTAMP not null,
updated_at timestamp null,
deleted_at timestamp null
);
-- auto-generated definition
create table taggables
(
id int auto_increment
primary key,
tag_id int null,
taggable_type varchar(512) null,
taggable_id int null,
created_at timestamp default CURRENT_TIMESTAMP not null,
updated_at timestamp null,
deleted_at timestamp null,
constraint fk23
foreign key (tag_id) references tags (id)
on update cascade on delete cascade
);
create index taggables_tag_id_index
on taggables (tag_id);
這是我用於這些表的 eloquent 模型:
class BaseModel extends Model
{
protected $table;
protected $primaryKey;
use SoftDeletes;
}
class BlogModel extends BaseModel
{
protected $table = 'blog';
protected $primaryKey = 'id';
public function tags()
{
return $this->morphedByMany(TagsModel::class,'taggable', null, 'tag_id');
}
}
class TagsModel extends BaseModel
{
protected $table = 'tags';
protected $primaryKey = 'id';
public function blog()
{
return $this->morphedByMany(BlogModel::class,"taggable");
}
}
save()
用於將帶有標簽的帖子保存到數據庫中:
public function save($model, $title, $passage, $author, $category, $category_id, $img_url, $tag, $user_id)
{
$model->title = $title;
$model->content = $passage;
$model->author = $author;
$model->category = $category;
$model->category_id = $category_id;
$model->img_url = $img_url;
$model->user_id = $user_id;
$model->save();
return $model->tags()->saveMany($tag);
}
在這里,我創建了一個標簽列表,例如['tag1','tag2','tag3']
並將其傳遞給上面介紹的save()
方法:
private function tags($tags)
{
$tag = array();
foreach ($tags as $t)
array_push($tag,['name' => $t]);
return $tag;
}
最后,錯誤是
Argument 1 passed to Illuminate\Database\Eloquent\Relations\BelongsToMany::save() must be an instance of Illuminate\Database\Eloquent\Model, array given, called in /var/www/test/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php on line 946 and defined in /var/www/test/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php on line 927
您需要像這樣構建標簽數組:
private function tags($tags)
{
$tag = array();
foreach ($tags as $t)
$tag[] = new TagsModel(['name' => $t]);
return $tag;
}
我通過將 model 更改為此解決了我的問題:
class BlogModel extends BaseModel
{
protected $table = 'blog';
protected $primaryKey = 'id';
public function tags()
{
return $this->morphToMany(TagsModel::class,'taggable',null,null,'tag_id');
}
}
class TagsModel extends BaseModel
{
protected $table = 'tags';
protected $primaryKey = 'id';
protected $fillable = ['name'];
public function blog()
{
return $this->morphedByMany(BlogModel::class,"taggable");
}
}
而且我從可標記中刪除主鍵和外鍵。
create table taggables
(
tag_id int null,
taggable_id int null,
taggable_type varchar(512) null,
created_at timestamp default CURRENT_TIMESTAMP null,
deleted_at timestamp null,
updated_at timestamp null
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.