1

我在 db 有两张表,其中一张被命名users,其中仅包含网站的用户信息,另一张tags包含一些用户可以从中选择的主题标签。

(就像 Stackoverflow 一样,用户可以选择多个标签,例如phpjavascript等)

所以为了在这两者之间建立这种关系,我在User模型中添加了这个:

public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }

还有这个要Tag建模:

public function users()
    {
        return $this->belongsToMany(User::class);
    }

这里是blade上的select选项,用户可以从db中选择多个标签:

<select class="form-control BSinaBold" name="skills[]" id="skills" multiple>
    @foreach(\App\Models\Tag::all() as $tag)
        <option value="{{ $tag->id }}" {{ in_array($tag->id , Auth::user()->tags->pluck('id')->toArray()) ? 'selected' : '' }}>{{ $tag->name }}</option>
    @endforeach
</select>

然后在控制器上,我添加了这个以更新tags表中的数据:

public function update(Request $request, $profile)
{
    $validate_data = Validator::make($request->all(),[
        'job' => 'nullable',
        'stackoverflow' => 'nullable',
        'github' => 'nullable',
        'instagram' => 'nullable',
        'linkedin' => 'nullable',
        'website' => 'nullable',
        'location' => 'nullable',
        'skills' => 'array',
    ]);

    $user = User::findOrFail($profile);

    $user->update([
        'job' => request('job'),
        'stackoverflow' => request('stackoverflow'),
        'github' => request('github'),
        'instagram' => request('instagram'),
        'linkedin' => request('linkedin'),
        'website' => request('website'),
        'location' => request('location'),
    ]);

    $user->tags()->sync(request('skills'));

    $user->save();

    return view('profile');
}

它工作正常且完美,但唯一的问题是这一行,它不会在tags表中同步数据:

$user->tags()->sync(request('skills'));

所以我尝试调试,我发现那request('skills')是空的!

那么问题来了,为什么它不向Controller发送任何数据呢?

我真的很感激你们的任何想法或建议......

提前致谢。

4

1 回答 1

2

我认为您错误地定义了模型关系。标记模型应为:

      public function user()
      {
         return $this->belongsTo(User::class);
      }

和用户模型关系:

      public function tags()
       {
          return $this->hasMany(Tag::class);
       }
    

如果您的目标是建立一对多的关系。

于 2021-02-26T10:57:12.687 回答