使用表單接受使用者輸入並將其存儲到數據庫
本教程是 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 |
|
模型是一個資源,一旦你定義了一個模型,你以後就可以創建一個新的資源、刪除它、更新它。
現在讓我們來建立一個表單來將新狗添加到數據庫中。
在 routes/web.php 中添加一個新條目:
1 | Route::get('/newdog', function () { |
我們創建一個名為 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 | use App\Http\Controllers\DogController; |
在 resources/views/ 中創建一個 newdog.blade.php 文件,其中包含一個表單,其 action 屬性指向 dog.create 路由:
1 | <form method="post" action="{{ route('dog.create') }}"> |
如果你停止了服務,運行 php artisan serve,並打開 http://127.0.0.1:8000/newdog。
樣式不是很好,但表單會顯示出來:
現在回到 app/Http/Controllers/DogController.php 文件。
在類中,我們導入 Dog 模型,然後添加一個 create 方法,該方法首先驗證表單,然後將狗存儲到數據庫中。
最後,我們重定向到 index 路由:
1 |
|
現在返回表單,輸入一個名字,然後點擊“提交”:
你將被重定向到 /dogs,新狗保存到數據庫後。
在瀏覽器中現在有一個錯誤,但不要擔心 - 這是因為我們尚未添加一個 dogs 視圖。
在這個視圖中,我們將顯示數據庫中的數據。
創建文件 resources/views/dogs.blade.php,然後我們將使用 Blade 妙方來遍歷 $dogs 數組,將數據顯示給用戶:
1 | @foreach ($dogs as $dog) |
這些數據不是無中生有的,它必須傳遞給模板。
因此,在 routes/web.php 中,我們現在有:
1 | Route::get('/dogs', function () { |
我們需要首先從模型中檢索數據,然後將其傳遞給視圖。
首先,在文件頂部導入模型:
1 | use App\Models\Dog; |
然後,在路由中調用 Dog::all(); 以獲取所有存儲的狗,並將它們分配給一個 $dogs 變量,並將其傳遞給模板:
1 | Route::get('/dogs', function () { |
以下是結果: