我正在我的laravel项目中制作简单的标记功能。我已经制作了表tags
id | tag
我也有表items
id | title | description
和第三个表item_tag
,其中包含item
的ID和tag
的ID
在我的物品模型中,我添加了这种关系
public function tags() {
return $this->belongsToMany('App\Tag', 'item_tag');
}
以及Tag模型中的关系
public function itemTags() {
return $this->belongsToMany('App\Item', 'item_tag');
}
项目创建控制器具有create()
用于视图,store()
用于存储项目
public function create(){
$allTags = Tag::all();
return view('items.create', compact('allTags'));
}
public function store( ItemRequest $request ){
$item = new Item;
$item->title = $request['title'];
$item->description = $request['description'];
$item->save();
return redirect()->route('items');
}
在带有多个的表单标签选择上(不确定这样做是否正确)
<div class="form-group">
{!! Form::label('tags', 'Tags', array('class'=> 'col-sm-2 control-label')) !!}
<div class="col-sm-10">
<select name="tags[]" class="form-control select2" id="tags" multiple>
@foreach($allTags as $tag)
<option value="{!!$tag->id!!}">{!!$tag->tag!!}</option>
@endforeach
</select>
</div>
</div>
我的问题是如何在数据透视表中抓取并保存标签ID和项目ID?然后在项目的页面上显示标签?
更新
在dd($item)
我在关系中看到了这个
#relations: array:3 [▼
"tags" => Collection {#330 ▼
#items: array:1 [▼
0 => Tag {#329 ▼
#table: "tags"
#primaryKey: "id"
#fillable: array:1 [▶]
#connection: null
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:10 [▼
"id" => 5
"tag" => "testTag"
"title" => null
"subtitle" => null
"page_image" => null
"meta_description" => null
"layout" => null
"reverse_direction" => null
"created_at" => "2017-01-25 06:52:59"
"updated_at" => "2017-01-25 06:52:59"
]
}
]
}
]
答案 0 :(得分:4)
通常,您希望从项目中分离所有标记,并仅附加用户在表单中添加的标记。在这种情况下,请使用sync()
方法。
sync方法接受要放在中间表上的ID数组。将从中间表中删除不在给定数组中的任何ID。因此,在此操作完成后,只有给定数组中的ID将存在于中间表
中
例如:
$item = new Item;
$item->title = $request['title'];
$item->description = $request['description'];
$item->save();
// If some tags are new, you should create them here first and get their IDs from a DB.
$item->tags()->sync($request->tags);