как сохранить список массивов тегов в базе данных, используя eloquent laravel - PullRequest
0 голосов
/ 02 мая 2020

Я собираюсь сохранить сообщение с некоторыми тегами внутри моих таблиц, но я не могу сохранить список тегов, связанных с этим новым сообщением. У меня есть таблица 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

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Я исправил свою проблему, изменив модель на эту:


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
);



0 голосов
/ 02 мая 2020

Вам понадобится построить массив тегов следующим образом:

    private function tags($tags)
    {
        $tag = array();
        foreach ($tags as $t)
            $tag[] = new TagsModel(['name' => $t]);


        return $tag;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...