Laravel 5.2中的简单标签系统

时间:2017-01-25 08:32:37

标签: php laravel laravel-5

我正在我的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"
          ]
        }
      ]
    }
  ]

1 个答案:

答案 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);