Добавить теги в Laravel Built Blog

Я создал блог с Laravel, но я не понял, как добавить к нему теги. Я бы хотел избежать использования пакетов. Вот код, который у меня есть до сих пор:

ТегиController –

namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Tag; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Session; class TagsController extends Controller { public function index() { $tags = Tags::paginate(4); return view('dashboard/tags/index', compact('tags')); } public function create() { return view('dashboard/tags/create'); } public function store() { $tags = new Tags; $tags->name= $request->input('name'); $tags->save(); Session::flash('flash_message', 'Tag successfully added!'); return Redirect('/dashboard/tags'); } } 

Модель тегов

 namespace App; use Illuminate\Database\Eloquent\Model; class Tag extends Model { public function posts() { return $this->belongsToMany('App\Post'); } } 

Я не уверен, как добавить несколько тегов, поэтому я могу помещать их в сообщения.

Я нахожусь на Laravel 5.3.

Solutions Collecting From Web of "Добавить теги в Laravel Built Blog"

Сообщение может иметь несколько / несколько тегов, а тег может использоваться несколькими / несколькими сообщениями. Это в основном означает, что между почтой и тегом существует связь « Много-ко-многим» .

Чтобы определить отношение «многие ко многим», вам понадобятся 3 таблицы базы данных

  1. сообщений
  2. теги
  3. post_tag

post_tag будет иметь post_id и tag_id с миграцией как

 class CreatePostTagPivotTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('post_tag', function(Blueprint $table) { $table->integer('post_id')->unsigned()->index(); $table->foreign('post_id')->references('id')->on('posts')->onUpdate('cascade')->onDelete('cascade'); $table->integer('tag_id')->unsigned()->index(); $table->foreign('tag_id')->references('id')->on('tags')->onUpdate('cascade')->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('post_tag'); } } 

Вы можете определить отношения в соответствующих моделях как

 namespace App; use Illuminate\Database\Eloquent\Model; class Tag extends Model { public function posts() { return $this->belongsToMany('App\Post'); } } namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { public function tags() { return $this->belongsToMany('App\Tag'); } } 

Затем вы можете получить доступ к отношению, например, обычно вы используете $tag->with('posts')->get(); получить все сообщения, связанные с тегом и т. д.

Кстати, в вашем контрольном коде есть опечатка new Tags она должна быть $tag = new Tag; , Имя модели у вас есть Tag .

Надеюсь это поможет.

ОБНОВИТЬ

Затем в вашей форме создания-сообщения вы можете ввести ввод, как

 <input type="text" name="tags" class="form-control"/> //here you can input ','(comma)separated tag names you want to associate with the post 

И в вашем PostsController

 public function store(Request $request) { $post = Post::create([ 'title' => $request->get('title'), 'body' => $request->get('body') }); if($post) { $tagNames = explode(',' $request->get('tags')); $tagIds = []; foreach($tagNames as $tagName) { //$post->tags()->create(['name'=>$tagName]); //Or to take care of avoiding duplication of Tag //you could substitute the above line as $tag = \Tag::firstOrCreate(['name'=>$tagName]); if($tag) { $tagIds[] = $tag->id; } } $post->tags()->sync($tagIds); } }