我打算在我的表格内保存一个带有一些标签的帖子,但我无法保存与这个新帖子相关的标签列表。我有一个Blog、Tag、Taggable的表格,呈现在下面。
-- 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);
而这是我的这些表格的雄辩模型。
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;
}
我把模型改成这样就解决了问题:
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");
}
}
而且我还从taggables中删除了主键和外键。
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
);