Laravel - 如果不存在则创建很多

时间:2014-10-14 14:46:26

标签: laravel orm eloquent

我有一个表格,用于将标签名称存储为"标记"

代码

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');
}

1 个答案:

答案 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同步关系表(插入)或者在必要时从枢轴中删除数据)