提问者:小点点

laravel中的同步功能未按预期工作


我有一个编辑表单,应该更新一个activity与选定的类别,但同步功能没有发挥预期的作用。

它会将选中的复选框添加到数据库中,但不会删除旧值。 从而导致数据透视表中有多个相同的值。

表单代码:

<p class="activiteit-categorie">
                <label>categorie</label>
                @foreach ($categories as $categorie)
                    <div class="categorie-input">
                        <input type="checkbox" name="categories[]" value="{{ $categorie->id }}"><label for="categorie">{{$categorie->name}}</label><br>
                    </div>
                @endforeach
            </p>

控制器代码:

if ($request->has('categories')) {
            $activiteit->categorie()->sync($request->input('categories'));
    } else {
        $activiteit->categorie()->detach($request->input('categories'));
    }

    return redirect()->route('active-overview')->with('message', 'Activiteit is succesvol aangepast!');

模型分类:


namespace App;

use Illuminate\Database\Eloquent\Model;

class categorie extends Model
{
    protected $fillable = [
        'name'
    ];

    public function activiteit() {
        return $this->BelongsToMany('App\activiteit');
    }
}

模型活动IT:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class activiteit extends Model
{
    protected $fillable = [
        'name', 'image', 'intro', 'goal', 'traject', 'extra_info', 'duration', 'price'
    ];

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

共2个答案

匿名用户

你可以试试这个

class categorie extends Model{

    protected $fillable = [
        'name'
    ];

    public function activiteit() {
        return $this->BelongsToMany('App\activiteit','pivot_table_name','categorie_id','activiteit_id');
    }
}

像这样使用另一个模型

if ($request->has('categories')) {
    $activiteit->categorie()->sync($request->categories);
} else {
    $activiteit->categorie()->detach($request->categories);
}

这对我很管用

匿名用户

所以,在尝试了一些东西之后,我想出了一个简单的解决方案来解决我的问题。

我首先从所选activity中分离所有类别,然后将所选类别添加到透视表中。

$activiteit->categorie()->detach();

    if ($request->has('categories')) {
            $activiteit->categorie()->sync($request->categories);
    }