– ログイン系のアプリケーションでは、まずUserを作り、一通りmodel, view, controller, middlewareが出来てから、OneToManyの機能を作り込んでいく
– 主要機能や機能的な優先度から開発するのではなく、データベースのテーブル構造に沿って、開発をしていく
– 先にDBにデータを入れながらコーディングしていく
$ php artisan make:controller –resource AdminPostsController
AdminPostsController.php
public function index() { // return view('admin.posts.index'); }
/layouts/admin.blade.php
<li> <a href="{{route('admin.posts.index')}}">All Posts</a> </li> <li> <a href="{{route('admin.posts.create')}}">Create Post</a> </li>
$ php artisan make:model Post -m
posts migration file
Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned()->index(); $table->integer('category_id')->unsigned()->index(); $table->integer('photo_id')->unsigned()->index(); $table->string('title'); $table->text('body'); $table->timestamps(); });
$ php artisan migrate
Model:Post.php
protected $fillable = [ 'category_id', 'photo_id', 'title', 'body' ];
$ php artisan tinker;
Psy Shell v0.7.2 (PHP 7.1.7 — cli) by Justin Hileman
>>> $post = App\Post::create([‘title’=>’my first post’, ‘body’=>’I love laravel’]);
=> App\Post {#661
title: “my first post”,
body: “I love laravel”,
updated_at: “2019-12-14 20:40:37”,
created_at: “2019-12-14 20:40:37”,
id: 1,
}
AdminPostsController.php
use App\Post; public function index() { // $posts = Post::all(); return view('admin.posts.index', compact('post')); }
resources/views/posts/index.blade.php
<table class="table table-striped"> <thead> <tr> <th>Id</th> <th>User</th> <th>Category</th> <th>Photo</th> <th>Title</th> <th>body</th> <th>Created</th> <th>Updated</th> </tr> </thead> <tbody> @if($posts) @foreach($posts as $post) <tr> <td>{{$post->id}}</td> <td>{{$post->user_id}}</td> <td>{{$post->category_id}}</td> <td>{{$post->photo_id}}</td> <td>{{$post->title}}</td> <td>{{$post->body}}</td> <td>{{$post->created_at->diffForHumans()}}</td> <td>{{$post->updated_at->diffForHumans()}}</td> </tr> @endforeach @endif </tbody> </table>
Model:User.php
public function posts(){ return $this->hasMany('App\Post'); }
Model:Post.php
public function user(){ return $this->belongsTo('App\User'); } public function photo(){ return $this->belongsTo('App\Photo'); } public function category(){ return $this->belongsTo('App\Category'); }
> update posts set user_id=10 where id=1;
posts/index.blade.php
<td>{{$post->user->name}}</td>
Role.php
protected $fillable = [ 'name' ];
外部設計やワイヤーフレームだと、ユーザーエクスペリエンスが非常に重要なので、まずユーザーの主要機能を先に書いて管理者ページは後に書いた方が書きやすいが、実装フェーズだとユーザー登録できる管理者から先にコーディングしていく。
他のフレームワークでもそうなのかもしれないが、Laravelの開発ではDBのリレーションが非常に重要なんですね。
設計時と実装時で、作っていく順番が異なるので、気を付けないといけない。主要機能や難易度などから順番に実装するのではなく、DBのリレーション構造順。