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)
Другие вопросы по тегам