【问题标题】:Many to many relationships store and update in laravel多对多关系在 laravel 中存储和更新
【发布时间】:2017-05-12 07:57:11
【问题描述】:

我创建了三个表:

张贴表

id--title--body

标签表

id--名字

post_tag

post_id--tag_id

后模型

public function tags()
{
    return $this->belongsToMany('App\Tag');
}

标签模型

public function posts()
{
    return $this->belongsToMany('App\Post');
}

这是一个多对多的关系

我想在添加新帖子时存储标签,在更新帖子时更新标签,我使用 bootstrap-tagsinput 插件,对于添加帖子,我使用这种方法来存储新标签:

public function storeTags($post, $tags)
{
    $tagInputArr = explode(',', $tags);
    $tagArr = [];
    foreach ($tagInputArr as $tag) {
        $tagArr[] = new Tag(['name' => $tag]);
    }
    $post->tags()->saveMany($tagArr);
}

$post 是新的 post 对象,$tags 是来自 $request 的标签字符串。

对于更新帖子,我有一个问题,当我查看编辑帖子页面时,默认标签是从数据库中选择的,如果我想添加新标签,storeTags方法不起作用。

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    尝试在storeTags()中这样做

    $post->save();
    if (isset($request->tags)) {
        $post->tags()->sync($request->tags, false);
    } else {
        $post->tags()->sync(array());
    }
    

    updateTags()

    $post->save();
    if (isset($request->tags)) {
        $post->tags()->sync($request->tags);
    } else {
        $post->tags()->sync(array());
    }
    

    在标签的html文件中,使用这个

    <select class="form-control select2-multi" name="tags[]" multiple="multiple">
        @foreach ($tags as $tag)
            <option value="{{ $tag->id }}">{{ $tag->name }}</option>
        @endforeach
    </select>
    

    有一点不同,sync() 的更新方法不需要第二个参数。
    我推荐你watch这个标签创建的整个播放列表

    【讨论】:

    • 同步方法的参数是标签的id,但是$request->tags是标签的名字
    • 对不起,也许我的问题不够清楚,我想做的是在添加新帖子时删除或添加标签。就像wordpress的标签CRUD一样。
    • @ChenLee 你想知道如何删除标签吗??
    • 在这个tutorial中,所有标签都是在我添加新帖子或更新现有帖子时创建的,但是如果我想在更新现有帖子时添加新标签或删除现有标签,如何我写方法使用同步。
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多