问题描述
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在这里没有用,但是如果您验证其他字段,则可以用来更新联系人。