繁体   English   中英

如何使用 eloquent laravel 在数据库中保存标签数组列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM