【问题标题】:Laravel - CreateMany if not existsLaravel - CreateMany 如果不存在
【发布时间】:2014-12-09 10:04:11
【问题描述】:

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

标签

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-如果之前未创建,将它们添加到“标记”数据库 3- 写与标签和地点的关系

但我认为 Laravel 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');
}

【问题讨论】:

    标签: laravel orm eloquent


    【解决方案1】:

    你可以这样做:

    $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你同步关系表(插入或删除必要时来自枢轴的数据)

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 2023-02-21
      • 1970-01-01
      • 2016-01-13
      • 2023-02-16
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多