我有一个表格,用于将标签名称存储为"标记"
代码
id->Integer(unique)
title->String;
url->string;(unique)
我还有一个表来存储名为place
的地方地方
id->Integer(unique)
title->string
latitude->string
longtitue->string
一个地方可能有很多标签,这是我的place_tag表
place_tag
id->Integer(unique)
tag_id->Integer
place_id->Integer
当我尝试更新地点时,我需要这样做
1-检查发布的所有标签。 2-将它们添加到"标记"如果之前没有创建db 3-与标签和地点建立关系
但我认为Laravels ORM可以处理它,我走来走去但却无法找到一个好的解决方案。
请参阅我的更新程序我做错了什么。
public function update($id)
{
$place=Place::findOrFail($id);
$place->fill(Input::all());
$place->save();
$tags=explode(',',Input::get('tags'));
$tags_data=array();
foreach($tags as $tag) {
$tags_data[]=new Tag(array('title'=>$tag,'url'=>$tag));
}
$place->tags()->detach();
$place->tags()->saveMany($tags_data);
return Redirect::to('admin/places');
}
答案 0 :(得分:3)
你可以这样做:
$tagIds = [];
foreach ($tags as $tag) {
$tag = trim($tag);
if ($tag == '') {
continue;
}
$fTag = Tag::firstOrCreate( [ 'title' => $tag, 'url' => $tag ] );
$tagIds[] = $fTag->id;
}
$place->tags()->sync($tagIds);
我假设一个标签可以设置为多个位置(n:n关系),所以首先你基本上找到标签,如果它不存在你创建它然后使用sync
同步关系表(插入)或者在必要时从枢轴中删除数据)