Связь «Один ко многим» (One to many)

Создание таблиц

Сначала надо создать модели Post и Comment.

php artisan make:model Post -m
php artisan make:model Comment -m

В папке database/migrations/ будут созданы два файла, которые создадут таблицы в базе данных. В этих файлах надо прописать поля, которые надо создать в базе данных.

# database/migrations/{date}_create_posts_table.php
class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function(Blueprint $table){
            $table->increments('id');
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }

    // …
}


# database/migrations/{date}_create_comments_table.php
class CreateCommentsTable extends Migration
{
    public function up()
    {
        Schema::create('comments', function(Blueprint $table){
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('post_id')->unsigned();
            $table->text('message');
            $table->timestamps();

            // создать внешний ключ (foreign key)
            $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
        });
    }

    // …
}

И выполнить команду:

php artisan migrate

Для поля «post_id» создаётся внешний ключ (foreign key). Он позволяет при удалении поста автоматически удалять все его комментарии на стороне MySQL.

Вывод комментариев

В файле app/Post.php надо добавить следующий код:

# app/Post.php

class Post extends Model
{

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }

}

Теперь можно выбирать комментарии:

# app/Http/Controllers/PostController.php

class PostController extends Controller
{
    public function index()
    {
        // выборка комментариев поста
        $comments = Post::find(1)->comments;

        // выборка комментариев поста с условием
        $comments = Post::find(1)->comments()->where(['active' => 1])->get();
    }
}

Добавление комментария

Есть два способа добавить комментарий:

// 1-ый способ
Post::find(1)->comments()->create(['message' => 'Текст комментария', 'user_id' => 14]);

// 2-ой способ
$comment = new Comment(['message' => 'Текст комментария', 'user_id' => 14]);
Post::find(1)->comments()->save($comment);

В первом способе просто указывается массив, а во втором способе передаётся объект «Comment».

Если будет появляться ошибка «Add [message] to fillable property to allow mass assignment on [App\Comment]», то в файле app/Comment.php надо добавить свойство $fillable, в котором указаны поля, которые можно заполнять.

# app/Comment.php

class Comment extends Model
{
    // поля, доступные для заполнения
    protected $fillable = ['message', 'user_id'];
}