php - 如何使用 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);
这是我对这些表的雄辩模型:
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
解决方案
我通过将模型更改为此解决了我的问题:
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
);
推荐阅读
- html - 如何使用 HTML 和 CSS 添加 Windows 鼠标悬停效果
- c++ - 在移动构造函数中,“member(other.member)”的含义是什么
- docker - 设置 Hyperledger Fabric 开发环境时出现路由错误
- c++ - 为 QML ListView 实现 QAbstractListModel 子类?
- c++ - C++:使用 std::ofstream 的文本文件写入过程中的韩文字母编码问题
- vue.js - 如何将表格添加到 vue2-editor 组件?
- javascript - 如何在 JavaScript 动态中更改“伪”样式值?
- flutter - 我如何实际安装和使用 YouTube Android Player API?
- css - CSS - 另一个过渡不起作用的问题
- python - np.arange() 的舍入问题