获得很多对很多值,并且在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);

我成功获得了与tags关联的contact。但是如何获得所有tags一个标志,指示其中一个与之关联?

我正在尝试阻止获取所有tags并对其进行循环,并在每次迭代循环时均对所有contact_tags进行检查,并检查tag_id是否匹配。我想显示带有所有标签的复选框列表,并检查关系中的复选框。

解决方法

此代码可以为您提供帮助,但是我正在使用SELECT多个组件。您可以轻松地使其适应使用CHECKBOX组件。

联系人模型:

function my_func(use_promise) {
  ̶v̶a̶r̶ ̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶

  if (!use_promise) {
     var x = do_a_sync_function_that_takes_time();
     ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶x̶)̶
     return $q.when(x); 
  } else {
     return do_a_promise_function_that_takes_time()
     .then (function(data) {
        return (data); // this gets promisified as we are in .then
     })
     .catch(function (err) {return "Error ";});
  }
  ̶r̶e̶t̶u̶r̶n̶ ̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
}

ContactController.php

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

edit.blade.php

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

ContactController.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>

验证仅是示例。 $ validatedData在这里没有用,但是如果您验证其他字段,则可以用来更新联系人。