【问题标题】:get many to many values and which of them are selected in laravel获取多对多的值以及在 laravel 中选择了哪些值
【发布时间】:2020-10-24 21:04:31
【问题描述】:
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 是否匹配。我想显示一个带有所有标签的复选框列表并检查关系中的那些。

【问题讨论】:

  • 你在为联系人构建编辑页面吗?
  • 是的,我正在为显示可用标签的联系人构建创建和编辑页面

标签: laravel eloquent has-and-belongs-to-many


【解决方案1】:

此代码可以帮助您,但我使用的是 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 在这里没有用,但如果你验证其他字段,它可以用来更新联系人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多