/

使用表單接受使用者輸入並將其存儲到數據庫

使用表單接受使用者輸入並將其存儲到數據庫

本教程是 Laravel 手冊的一部分。從 https://flaviocopes.com/access/ 下載。

現在我們將創建一個表單來向表中添加狗。

為此,首先我們需要創建Dog模型

什麼是模型?模型是一個允許我們與存儲在數據庫中的數據進行交互的類。

每個模型代表數據庫中的一個特定表,我們使用它來創建、讀取、更新和刪除記錄。

從終端創建模型使用以下命令:

1
php artisan make:model Dog

這將在 app/Models/Dog.php 中創建一個模型:

注意,該類中包含了一個”Eloquent”文件夾下的一些類。

Eloquent 是一個 ORM(對象關係映射器),一個工具,基本上它允許我們使用一個(在這種情況下是 PHP)類與數據庫進行交互。

模型有一個對應的表,我們沒有提及它,但是它是我們之前創建的 dogs 表,因為命名約定是 dogs 表 → Dog 模型。

我們將使用這個模型來將一個條目添加到數據庫。

我們將向用戶顯示一個表單,他們可以添加狗的名字,並點擊“添加”按鈕,狗將被添加到數據庫中。

首先,我們將把我們在表中添加的 name 欄位添加到一個名為 $fillable 的數組中:

1
protected $fillable = ['name'];

像這樣:

1
2
3
4
5
6
7
8
9
10
11
12
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Dog extends Model
{
use HasFactory;
protected $fillable = ['name'];
}

模型是一個資源,一旦你定義了一個模型,你以後就可以創建一個新的資源、刪除它、更新它。

現在讓我們來建立一個表單來將新狗添加到數據庫中。

routes/web.php 中添加一個新條目:

1
2
3
Route::get('/newdog', function () {
return view('newdog');
});

我們創建一個名為 DogController 的控制器:

1
php artisan make:controller DogController

Laravel將一個 DogController.php 文件添加到 app/Http/Controllers/ 文件夾中。

什麼是控制器?控制器接受一個動作並確定要執行什麼操作。

例如,我們將創建一個向 /dogs 路由發送 POST 請求的表單。

路由將說“這個控制器負責處理”,並告訴我們要使用哪個方法。

在控制器內部,我們撰寫執行操作的方法,例如將數據添加到數據庫中或更新數據。

如果你不確定什麼是 POST 請求,請查看我的HTTP教程

我們將首先在控制器中添加一個 create 方法,用於處理來自表單的數據,以便我們可以將其存儲到數據庫中。

繼續之前,我們在 routes/web.php 中新增 POST /dogs 路由來處理控制器,並將其指定為 dog.create

同時,我們還添加了 /dogs 路由,我們稱之為 dogs,我們現在在其中渲染 dogs 視圖,但我們尚未創建:

1
2
3
4
5
6
7
8
9
10
11
12
use App\Http\Controllers\DogController;

// ...

Route::post(
'/dogs',
[DogController::class, 'create']
)->name('dog.create');

Route::get('/dogs', function () {
return view('dogs');
})->name('dogs');

resources/views/ 中創建一個 newdog.blade.php 文件,其中包含一個表單,其 action 屬性指向 dog.create 路由:

1
2
3
4
5
6
<form method="post" action="{{ route('dog.create') }}">
@csrf
<label>Name</label>
<input type="text" name="name" id="name">
<input type="submit" name="send" value="Submit">
</form>

如果你停止了服務,運行 php artisan serve,並打開 http://127.0.0.1:8000/newdog

樣式不是很好,但表單會顯示出來:

現在回到 app/Http/Controllers/DogController.php 文件。

在類中,我們導入 Dog 模型,然後添加一個 create 方法,該方法首先驗證表單,然後將狗存儲到數據庫中。

最後,我們重定向到 index 路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Dog;

class NewDogFormController extends Controller
{
public function create(Request $request)
{
$this->validate($request, [
'name' => 'required',
]);
Dog::create($request->all());

return redirect()->route('index');
}
}

現在返回表單,輸入一個名字,然後點擊“提交”:

你將被重定向到 /dogs,新狗保存到數據庫後。

在瀏覽器中現在有一個錯誤,但不要擔心 - 這是因為我們尚未添加一個 dogs 視圖。

在這個視圖中,我們將顯示數據庫中的數據。

創建文件 resources/views/dogs.blade.php,然後我們將使用 Blade 妙方來遍歷 $dogs 數組,將數據顯示給用戶:

1
2
3
@foreach ($dogs as $dog)
{{ $dog->name }}
@endforeach

這些數據不是無中生有的,它必須傳遞給模板。

因此,在 routes/web.php 中,我們現在有:

1
2
3
Route::get('/dogs', function () {
return view('dogs');
})->name('dogs');

我們需要首先從模型中檢索數據,然後將其傳遞給視圖。

首先,在文件頂部導入模型:

1
use App\Models\Dog;

然後,在路由中調用 Dog::all(); 以獲取所有存儲的狗,並將它們分配給一個 $dogs 變量,並將其傳遞給模板:

1
2
3
4
Route::get('/dogs', function () {
$dogs = Dog::all();
return view('dogs', ['dogs' => $dogs]);
})->name('dogs');

以下是結果: