首页 > 解决方案 > 获取多对多的值以及在 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);

我成功获得了tagscontact. 但是我怎样才能得到 alltags和一个标志,指示其中哪一个是关联的?

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

标签: laraveleloquenthas-and-belongs-to-many

解决方案


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

触点型号:

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

联系人控制器.php

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

编辑刀片.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 在这里没有用,但如果您验证其他字段,它可以用来更新联系人。


推荐阅读