簡體   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