接續上篇建立完migration,本日將完成文章的CRUD
今天就先不太多廢話了,趕緊完成CRUD吧!
本篇內容略多...
在上一篇的內容,有提到migration的建立與資料遷移。現在我們打開app\Post.php,在model的class內新增欄位,並給予欄位批量賦值的修飾:
class Post extends Model
{
protected $fillable = [
'name', 'title', 'content',
];
}
// create方法
$data = [
'column_1' => '...',
'column_2' => '...',
];
Post::create($data);
// save方法
$post = new Post;
$post->column_1 = '...';
$post->column_2 = '...';
$post->save();
※當然,model內還有許多對欄位的屬性設定,比如指定model對應的資料表 (若未指定,會預設指向對應名稱的資料表,如:Post→posts)
protected $table = 'table_name';
為何會一起講解畫面、路由與controller呢?因為當你指定某個URL來呼叫頁面或API時,路由檔會先檢查該URL是否被定義,有被定義的話則會執行該路由所指定controller的function;若沒定義就會報錯。例如
// 透過GET方法,導向「/test」,執行TestController的test function,並回傳某個畫面
Route::get('/test', 'TestController@test');
// 進入test function後,回傳「resources\views\test.blade.php」的頁面
class TestController extends Controller
{
public function test()
{
return view('test');
}
}
在command輸入以下指令為我們建立文章的controller
php artisan make:controller PostController --resource
routes\web.php中,定義新路由:
Route::resource('post', 'PostController');
為了避免views資料夾因為頁面太多而雜亂,因此先在resources\views底下建立「post」資料夾,並在posts內建立「index.blade.php」,用來顯示文章列表:接著在command輸入以下指令
php artisan make:auth
編輯app\Http\Controllers\PostController.php
use App\Post;
class PostController extends Controller
{
// ...略
public function index()
{
$datas = Post::get();
return view('post.index', compact('datas'));
}
// ...略
public function show($id)
{
$data = Post::find($id);
return view('post.show', compact('data'));
}
}
編輯index.blade.php:
@extends('layouts.app')
@section('content')
<a href="/post/create">新增文章</a>
<div align="center">
@foreach ($datas as $key => $data)
<a href="/post/{{ $data->id }}">{{ $data->title }}</a> <br />
作者:{{ $data->name }} <br />
內容:{{ $data->content }} <br />
@endforeach
</div>
@endsection
建立show.blade.php
@extends('layouts.app')
@section('content')
姓名:{{ $data->name }} <br />
標題:{{ $data->title }} <br />
內容:{{ $data->content }} <br />
<a href="/post/{{ $data->id }}/edit" >
<button>編輯</button>
</a>
<form action="/post/{{ $data->id }}" method="POST">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<a href="">
<button>刪除</button>
</a>
</form>
@endsection
修改PostController的destroy function
public function destroy($id)
{
Post::destroy($id);
return redirect('/post');
}
建立create.blade.php,並編輯
@extends('layouts.app')
@section('content')
<form action="/post" method="POST">
姓名:<input type="text" name="name" /><br />
標題:<input type="text" name="title" /><br />
內容:<textarea name="content"></textarea>
{{ csrf_field() }}
<input type="submit" value="送出" />
</form>
@endsection
修改PostController的create 及 store function
// ...略
public function create()
{
return view('post.create');
}
// ...略
public function store(Request $request)
{
$data = $request->all();
Post::create($data);
return redirect('/post');
}
修改PostController的edit 與 update function
public function edit($id)
{
$data = Post::find($id);
return view('post.edit', compact('data'));
}
public function update(Request $request, $id)
{
$data = $request->all();
Post::find($id)->update($data);
return redirect('/post/'.$id);
}
新增edit.blade.php並編輯
@extends('layouts.app')
@section('content')
<form action="/post/{{ $data->id }}" method="POST">
姓名:<input type="text" name="name" value="{{ $data->name }}" /> <br />
標題:<input type="text" name="title" value="{{ $data->title }}" /> <br />
內容:<textarea name="content">{{ $data->content }}</textarea>
{{ csrf_field() }}
{{ method_field('PATCH') }}
<input type="submit" value="送出" />
</form>
@endsection
為何edit.blade.php資料編輯,照你的方式是對的??
@extends('members.base')
@section('main')
會員--修改
<form action="{{action('MemberController@update', $member->id , $member->mem_name)}}" method="put" >
@csrf
<label>會員名稱:
<input name="mem_name" value="{{$member->mem_name}}"></input>
</label><br>
<input type="submit" value="送出">
</form>
@endsection
用這樣就可以?!
@extends('members.base')
@section('main')
會員--修改
<form action="/members/{{ $member->id }}" method="post" >
@csrf
<label>會員名稱:
<input name="mem_name" value="{{$member->mem_name}}"></input>
</label><br>
{{ method_field('PATCH') }}
<input type="submit" value="送出">
</form>
@endsection
我大概了解意思了!!
用POST方法傳送,然後再送出一個隱藏屬性PUT
讓laravel,幫你處理路由
@extends('members.base')
@section('main')
會員--修改
<!-- /members/{{ $member->id }} -->
<form action="{{ route('members.update', $member->id)}}" method="post" >
<!-- _token 隱藏欄位-->
@csrf
<label>會員名稱:
<input name="mem_name" value="{{$member->mem_name}}"></input>
</label><br>
<!--PUT/PATCH /members/{member} update members.update -->
<!--用POST方法傳送,然後再送出一個隱藏屬性PUT -->
@method('PUT')
<input type="submit" value="送出">
</form>
@endsection