Я создал блог с 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.
Сообщение может иметь несколько / несколько тегов, а тег может использоваться несколькими / несколькими сообщениями. Это в основном означает, что между почтой и тегом существует связь « Много-ко-многим» .
Чтобы определить отношение «многие ко многим», вам понадобятся 3 таблицы базы данных
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); } }