获取多对多值,并在 laravel 中选择了哪些值

get many to many values and which of them are selected in laravel

Contacts:
id
name

Tags:
id
name

ContactTags:
contact_id
tag_id

在联系人模型中:

public function tags()
{
    return $this->belongsToMany(Tags::class, "contacts_tags", "contact_id", "tag_id");
}

所以如果我这样做

$contact = Contacts::findOrFail($id);
dd($contact->tags);

我成功获取了与 contact 关联的 tags。但是我怎样才能得到所有 tags 和一个标志,指示其中一个是关联的?

我试图阻止获取所有 tags,循环它们并在每次迭代中循环所有 contact_tags 并检查 tag_id 是否匹配。我想显示包含所有标签的复选框列表并检查关系中的复选框。

此代码可以为您提供帮助,但我使用的是 SELECT 多组件。您可以轻松调整它以使用 CHECKBOX 组件。

联系人模型:

public function tags()
{
    return $this->belongsToMany(Tags::class, "contacts_tags", "contact_id", "tag_id");
}

ContactController.php

public function edit(Contact $contact)
{
    $tags = Tag::all();
    return view('contacts.edit',compact('contact', 'tags'));        
}

edit.blade.php

<div class="row">
        <div class="col">
            <div class="form-group">
                <strong>Tags:</strong>
                <select name="tags_id[]" multiple>
                    @foreach ($tags as $tag)
                        @if( $contact->tags->contains($tag) )
                            <option value="{{ $tag->id }}" selected>{{ $tag->name }}</option>
                        @else
                            <option value="{{ $tag->id }}">{{ $tag->name }}</option>
                        @endif
                    @endforeach
                </select>
            </div>
        </div>
    </div>

更新在 ContactController.php

public function update(Request $request, Post $contact)
{   
    $validatedData = $request->validate([
            'tags_id' => ['array'],
        ]);

    $contact->update($request->all());
    $contact->tags()->sync($validatedData['tags_id']); 

    return redirect()->route('contact.index')->with('success', 'Contact successfully updated!');
}

验证只是一个例子。 $validatedData 在这里没有用处,但如果您验证其他字段,它可用于更新联系人。