formはlaravel collectiveを使用。make:model ${modelName} -mでDBを作って、データを挿入し、select文に対してControllerのcreateメソッドからデータを渡す
View: create.blade.php
{!! Form::open(['method'=>'POST', 'action'=>'AdminPostsController@store', 'files'=>true]) !!} {{ csrf_field()}} <div class="form-group"> {!! Form::label('title', 'Title') !!} {!! Form::text('title', null, ['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('category_id', 'Category') !!} {!! Form::select('category_id', array(''=>'options'), null, ['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('photo_id', 'Photo') !!} {!! Form::file('photo_id', null,['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('body', 'Description') !!} {!! Form::textarea('body', null, ['class'=>'form-control', 'rows'=>3]) !!} </div> <div class="form-group"> {!! Form::submit('Create Post', ['class'=>'btn btn-primary']) !!} </div> {!! Form::close() !!}
$ php artisan make:request PostsCreateRequest
Requests/PostCreateRequest.php
public function rules() { return [ 'category_id' => 'required', 'photo_id' => 'required', 'title' => 'required', 'body' => 'required' ]; }
AdminPostsController.php
use App\Http\Requests\PostsCreateRequest; use Illuminate\Support\Facades\Auth; public function store(PostsCreateRequest $request) { // $input = $request->all(); $user = Auth::user(); if($file = $request['photo_id']){ $name = time(). $file->getClientOriginalName(); $file->move('images', $name); $photo = Photo::create(['file'=>$name]); $input['photo_id'] = $photo->id; } $user->posts()->create($input); return redirect('/admin/posts'); }
View: posts/index.blade.php
<tr> <td>{{$post->id}}</td> <td>{{$post->user->name}}</td> <td>{{$post->category_id}}</td> <td><img height="50" src="{{$post->photo ? '/' . $post->photo->file : 'https://placehold.it/50x50'}}"></td> <td>{{$post->title}}</td> <td>{{$post->body}}</td> <td>{{$post->created_at->diffForHumans()}}</td> <td>{{$post->updated_at->diffForHumans()}}</td> </tr>
$ php artisan make:model Category -m
Model: Category.php
class Category extends Model { // protected $fillable = ['name']; }
Post.php
public function category(){ return $this->belongsTo('App\Category'); }
categories migration files
Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
$ php artisan migrate
insert into categories (name) values (‘PHP’);
insert into categories (name) values (‘Laravel’);
insert into categories (name) values (‘JavaScript’);
insert into categories (name) values (‘Photoshop’);
/posts/index.blade.php
<td>{{$post->category ? $post->category->name : 'Uncategorized'}}</td>
AdminPostsController
use App\Category; public function create() { // $categories = Category::lists('name', 'id')->all(); return view('admin.posts.create', compact['categories']); }
View: posts/create.blade.php
<div class="form-group"> {!! Form::label('title', 'Title') !!} {!! Form::text('title', null, ['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('category_id', 'Category') !!} {!! Form::select('category_id', array(''=>'Choose Options') + $categories, null, ['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('photo_id', 'Photo') !!} {!! Form::file('photo_id', null,['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('body', 'Description') !!} {!! Form::textarea('body', null, ['class'=>'form-control', 'rows'=>3]) !!} </div>
DBにuncategorizedという値を入れずに、view側で$post->category ? $post->category->name : ‘Uncategorized’と書く方法は面白い、isnt it?