Laravel - CreateMany 如果不存在

fob*_*bus 2 orm laravel eloquent

我有一个表,将标签名称存储为“标签”

标签

id->Integer(unique)
title->String;
url->string;(unique)
Run Code Online (Sandbox Code Playgroud)

我还有一张表来存储名为 place 的地方

地方

id->Integer(unique)
title->string
latitude->string
longtitue->string
Run Code Online (Sandbox Code Playgroud)

一个地方可能有很多标签,这是我的 place_tag 表

地点标签

id->Integer(unique)
tag_id->Integer
place_id->Integer
Run Code Online (Sandbox Code Playgroud)

当我尝试更新地点时,我需要这样做

1- 检查发布的所有标签。2- 如果之前未创建,则将它们添加到“标记”数据库中 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');
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*łek 7

你可以这样做:

$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);
Run Code Online (Sandbox Code Playgroud)

我假设一个标签可以设置为多个位置(n:n 关系),所以首先你基本上找到标签,如果它不存在你创建它然后使用sync你同步关系表(必要时从数据透视表插入或删除数据)