2 модели со сводной таблицей, отношение многие ко многим
Я пытаюсь создать блог, и у меня есть две модели, Post и Tag. Я хочу соединить их обоих с помощью сводной таблицы. Это отношения многие ко многим, и я не могу понять, как связать записи и теги вместе. когда я пытаюсь сделать это, он ничего не возвращает в моей БД. Сообщения имеют заголовок и содержание, а теги - только имя. Я читал, что должен использовать метод синхронизации или attach-detach, но я не знаю, где это сделать. Это на сообщениях маршрутов или тегах маршрутов? Маршруты постов и тегов я включил в route.php, сгруппировав их с помощью:
Route::resource('/tags', 'TagController');
Route::resource('/posts', 'PostController');
Вот что у меня так далеко:
Модель "Мой пост":
class Post extends Model{
protected $fillable = [
'title', 'content'
];
protected $hidden = [
'view_count'
];
public function tags()
{
return $this->belongsToMany('App\Tag', 'post_tag');
}}
Вот моя модель Tag:
class Tag extends Model{
protected $fillable = [
'name'
];
public function posts(){
return $this->belongsToMany('App\Post', 'post_tag');
}}
Вот моя сводная таблица post_tag:
class CreatePostTagTable extends Migration{
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned()->nullable()->index();
$table->foreign('post_id')->references('id')->on('posts');
$table->integer('tag_id')->unsigned()->nullable()->index();
$table->foreign('tag_id')->references('id')->on('tags');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('post_tag');
}}
2 ответа
Привет, я тоже новичок в Laravel, и у меня та же проблема с тобой. В вашем случае, я думаю, что лучшая практика это приложить его в вашем PostController.php
, Позвольте мне поделиться с вами кодом, и я надеюсь, что он поможет
PostController
public function store (Request $request) {
// First we need to create variable that contain your tag_id
// $tags = [1, 2, 4]; something like this
$tags = $request->input('tags');
// Now storing the data in posts table
$post = new Post;
$post->title = $request->input('title');
$post->content = $request->input('content');
$post->save();
//After save the post, we need to attach it
$post->tags()->attach($tags);
}
Изменить: Добавить пример просмотра
<div>
<input type="checkbox" id="subscribeNews" name="tags[]" value="1">
<label for="subscribeNews">Tag 1</label>
<input type="checkbox" id="subscribeNews" name="tags[]" value="2">
<label for="subscribeNews">Tag 2</label>
<input type="checkbox" id="subscribeNews" name="tags[]" value="3">
<label for="subscribeNews">Tag 3</label>
<input type="checkbox" id="subscribeNews" name="tags[]" value="n">
<label for="subscribeNews">More tag</label>
</div>
А затем в PostController.php вы можете получить идентификатор, если пользователь установит флажок:
$tags = $request->input('tags');
Edit2: Добавить пример использования синхронизации
Здесь я приведу небольшой пример использования синхронизации. Сначала давайте установим пост, в котором есть 5 тегов. И в конце мы просто хотим установить его 3
$post = Post::find(1) //get the post with id 1, this post have 5 tags
// Let's say that this post have 5 tags with this ids [1, 2, 3, 4, 5]
// And then admin edit this post and select the tag with id [1, 2, 6] we set it in $tags variable
$tags = $request->input('tags'); //[1, 2, 6]
// And the last we just need to use sync method like this
$post->tags()->sync($tags);
// After use that, it will detach the tag based from removed ids [3, 4, 5] and attach new tag if there's new tag id [6]
// And in the end the post just have 3 tags
Хорошо, это пример логики, я до сих пор изучаю это, но я надеюсь, что это поможет вам:D
Использование sync()
функция, например:
$post->tags()->sync($array_of_tags_ids)