使用表單接受使用者輸入並將其存儲到數據庫
本教程是 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 () { |
以下是結果: