migration時に$table->foreign(‘user_id’)->references(‘id’)->on(‘users’)->onDelete(‘cascade’);と書く
AdminPostsController.php
public function edit($id)
{
//
$post = Post::findOrFail($id);
$categories = Category::lists('name', 'id')->all();
return view('admin.posts.edit', compact('post','categories'));
}
View: edit.blade.php
<h1>Edit Post</h1>
{!! Form::Model($post, ['method'=>'PATCH', 'action'=>['AdminPostsController@update', $post->id], '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', $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>
<div class="form-group">
{!! Form::submit('Create Post', ['class'=>'btn btn-primary']) !!}
</div>
{!! Form::close() !!}
</div>
<div class="row">
@include('includes.form_error')
</div>
index.blade.php
<tr>
<td>{{$post->id}}</td>
<td><img height="50" src="{{$post->photo ? '/' . $post->photo->file : 'https://placehold.it/50x50'}}"></td>
<td><a href="{{route('admin.posts.edit', $post->id)}}">{{$post->user->name}}</a></td>
<td>{{$post->category ? $post->category->name : 'Uncategorized'}}</td>
<td>{{$post->title}}</td>
<td>{{$post->body}}</td>
<td>{{$post->created_at->diffForHumans()}}</td>
<td>{{$post->updated_at->diffForHumans()}}</td>
</tr>
AdminPhotosController.php
public function update(Request $request, $id)
{
//
$input = $request->all();
if($file = $request['photo_id']){
$name = time(). $file->getClientOriginalName();
$file->move('images', $name);
$photo = Photo::create(['file'=>$name]);
$input['photo_id'] = $photo->id;
}
Auth::user()->posts()->whereId($id)->first()->update($input);
return redirect('/admin/posts');
}
### helper
laravel helper string functions
https://laravel.com/docs/master/helpers
string limit
https://laravel.com/docs/master/helpers#method-str-limit
<td>{{str_limit($post->body, 10)}}</td>
### delete
edit.blade.php
{!! Form::open(['method'=>'DELETE', 'action'=>['AdminPostsController@destroy', $post->id]]) !!}
{{ csrf_field()}}
<div class="form-group">
{!! Form::submit('Delete Post', ['class'=>'btn btn-danger col-sm-6']) !!}
</div>
{!! Form::close() !!}
AdminPostsController.php
public function destroy($id)
{
//
$post = Post::findOrFail($id);
unlink(public_path() . '/' . $post->photo->file);
$post->delete();
return redirect('/admin/posts');
}
### ユーザ削除するとpostsもdelete
Post 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();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
$ php artisan migrate:refresh
insert into roles (name) values (‘Administrator’);
insert into roles (name) values (‘Author’);
insert into roles (name) values (‘Subscriber’);
insert into categories (name) values (‘PHP’);
insert into categories (name) values (‘Laravel’);
insert into categories (name) values (‘JavaScript’);
insert into categories (name) values (‘Photoshop’);
update posts set user_id=10 where id=1;
update users set role_id=1 where id=1;
update posts set user_id=2 where id=2;
AdminUserController.php
public function destroy($id)
{
//
$user = User::findOrFail($id);
if($user->photo !== NULL){
unlink(public_path() ."/". $user->photo->file);
}
$user->delete();
Session::flash('deleted_user', 'The user has benn deleted');
return redirect('/admin/users');
}
edit.blade.php
<div class="col-sm-6">
<img src="{{$post->photo ? $post->photo->file : 'https://placehold.it/400x400'}}" alt="" class="img-responsive">
</div>
実際のアプリケーションでは、ユーザはsoftdeleteとして、更にユーザを削除しても、hasManyの子レコードは残したいケースが多いように思いますが、一緒に削除も可能です。
helperはstr_limit以外にも使えそうなものは使いたい。