Связь «Один ко многим» (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']; }
Поддержать автора
Все статьи создаются и поддерживаются одним человеком,
если вам нравится контент, вы можете поддержать автора сайта