https://laihao.vaserver.com/hairdressingusers
要來講解美髮預約系統_users的程式碼
就是MVC架構
/home/laihao/public_html/app/Models/Hairdressing/HairdressingUser.php
Models裡面的程式碼
<?php
namespace App\Models\Hairdressing;
use Illuminate\Database\Eloquent\Model;
class HairdressingUser extends Model
{
protected $connection = 'mysql_hairdressing';
protected $table = 'users';
protected $primaryKey = 'id';
public $timestamps = true;
protected $fillable = [
'name',
'email',
'password',
'role',
'status',
'last_login_at',
];
protected $hidden = [
'password',
];
public function staff()
{
return $this->hasOne(Staff::class, 'user_id');
}
}
這段程式碼定義了一個 Laravel 的 Eloquent 模型 HairdressingUser,用來操作另一個 MySQL 資料庫中的 users 資料表,並設定該模型與 Staff 模型的一對一關聯。
namespace App\Models\Hairdressing;
use Illuminate\Database\Eloquent\Model;
namespace App\Models\Hairdressing;:把這個模型放在 App\Models\Hairdressing 命名空間下,方便專案中分類管理(例如美髮相關的模型都放在這裡)。use Illuminate\Database\Eloquent\Model;:引入 Laravel 的 Eloquent 模型基底類別,之後 HairdressingUser 繼承它就能使用 Eloquent 的功能(查詢、新增、更新等)。class HairdressingUser extends Model
{
protected $connection = 'mysql_hairdressing';
protected $table = 'users';
protected $primaryKey = 'id';
public $timestamps = true;
class HairdressingUser extends Model:定義一個 Eloquent 模型類別,代表「美髮系統的使用者」。protected $connection = 'mysql_hairdressing';:指定這個模型要使用哪一個資料庫連線。這個名稱要在 config/database.php 的 connections 裡有定義,通常是用來連到另一個獨立的 MySQL 資料庫(例如美髮系統的專屬 DB)。protected $table = 'users';:指定對應的資料表名稱是 users。若沒指定,Eloquent 預設會用類別名稱的小寫複數(這裡會變成 hairdressing_users),所以這裡明確指定為 users。protected $primaryKey = 'id';:指定主鍵欄位名稱為 id(其實這也是預設值,但寫出來比較清楚)。public $timestamps = true;:告訴 Eloquent 這個表有 created_at 和 updated_at 欄位,新增/更新時會自動維護這兩個時間戳。protected $fillable = [
'name',
'email',
'password',
'role',
'status',
'last_login_at',
];
$fillable 定義哪些欄位可以透過「大量賦值」的方式寫入,例如:
HairdressingUser::create([
'name' => 'Alice',
'email' => 'alice@example.com',
'password' => '...',
'role' => 'admin',
'status' => 'active',
]);
$fillable 裡的欄位,用 create() 或 fill() 時會被忽略,這是 Laravel 防止「大量賦值漏洞」的機制。protected $hidden = [
'password',
];
$hidden 定義當模型轉成陣列或 JSON 時,哪些欄位要被隱藏。password 設為隱藏,所以當你回傳 return $user; 或 return response()->json($user); 時,密碼不會出現在結果中,避免洩漏敏感資訊。public function staff()
{
return $this->hasOne(Staff::class, 'user_id');
}
staff(),表示「一個使用者對應一個員工資料」。hasOne(Staff::class, 'user_id') 的意思是:
Staff(完整類別名稱要看 use 或命名空間,通常會是 App\Models\Hairdressing\Staff 之類)。staff 資料表上,欄位名稱為 user_id,指向本模型的 id。$user = HairdressingUser::find(1);
$staff = $user->staff; // 取得對應的 Staff 模型
這個模型主要用來:
mysql_hairdressing 的資料庫連線。users 資料表。fillable、hidden)。created_at / updated_at。Staff 模型建立一對一關聯,讓你可以從使用者輕鬆取得對應的員工資料。--
繼續MVC架構
/home/laihao/public_html/app/Http/Controllers/HairdressingUserController.php
在Controllers裡面的程式碼
<?php
namespace App\Http\Controllers;
use App\Models\Hairdressing\HairdressingUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class HairdressingUserController extends Controller
{
public function index()
{
$hairdressingusers = HairdressingUser::orderBy('name')->get();
return view('hairdressing.users.index', ['hairdressingusers' => $hairdressingusers]);
}
public function create()
{
return view('hairdressing.users.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:100',
'email' => 'required|email|max:150|unique:mysql_hairdressing.users,email',
'password' => 'required|min:6',
'role' => 'required|in:admin,receptionist,stylist',
'status' => 'required|in:active,inactive',
]);
HairdressingUser::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'role' => $request->role,
'status' => $request->status,
]);
return redirect()->route('hairdressingusers.index')->with('success', '使用者新增成功!');
}
public function edit(HairdressingUser $hairdressinguser)
{
return view('hairdressing.users.edit', ['hairdressinguser' => $hairdressinguser]);
}
public function update(Request $request, HairdressingUser $hairdressinguser)
{
$request->validate([
'name' => 'required|max:100',
'email' => 'required|email|max:150|unique:mysql_hairdressing.users,email,' . $hairdressinguser->id,
'password' => 'nullable|min:6',
'role' => 'required|in:admin,receptionist,stylist',
'status' => 'required|in:active,inactive',
]);
$data = [
'name' => $request->name,
'email' => $request->email,
'role' => $request->role,
'status' => $request->status,
];
if ($request->filled('password')) {
$data['password'] = Hash::make($request->password);
}
$hairdressinguser->update($data);
return redirect()->route('hairdressingusers.index')->with('success', '使用者資料更新成功!');
}
public function destroy(HairdressingUser $hairdressinguser)
{
$hairdressinguser->delete();
return redirect()->route('hairdressingusers.index')->with('success', '使用者已刪除!');
}
}
這是一個典型的 Laravel CRUD 控制器,用來管理「美髮系統的使用者」(HairdressingUser),包含列表、新增、儲存、編輯、更新、刪除等功能,並對密碼做雜湊處理、對欄位做驗證。
namespace App\Http\Controllers;
use App\Models\Hairdressing\HairdressingUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class HairdressingUserController extends Controller
App\Http\Controllers,表示這是控制器類別。HairdressingUser 模型:操作美髮系統的 users 資料表。Request:取得表單與請求資料。Hash:用來對密碼做雜湊(加密)。Controller:使用 Laravel 基礎控制器。下面依方法說明。
public function index()
{
$hairdressingusers = HairdressingUser::orderBy('name')->get();
return view('hairdressing.users.index', ['hairdressingusers' => $hairdressingusers]);
}
HairdressingUser::orderBy('name')->get();
mysql_hairdressing.users 資料表取出所有使用者。name 欄位排序(預設升冪)。view('hairdressing.users.index', [...])
resources/views/hairdressing/users/index.blade.php。$hairdressingusers 傳進視圖,在畫面上列出使用者清單。public function create()
{
return view('hairdressing.users.create');
}
resources/views/hairdressing/users/create.blade.php。<form>,action 指向 store 方法的路由。public function store(Request $request)
{
$request->validate([
'name' => 'required|max:100',
'email' => 'required|email|max:150|unique:mysql_hairdressing.users,email',
'password' => 'required|min:6',
'role' => 'required|in:admin,receptionist,stylist',
'status' => 'required|in:active,inactive',
]);
HairdressingUser::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'role' => $request->role,
'status' => $request->status,
]);
return redirect()->route('hairdressingusers.index')->with('success', '使用者新增成功!');
}
name:必填,最多 100 字。email:
unique:mysql_hairdressing.users,email:在 mysql_hairdressing 連線的 users 表中,email 必須唯一。password:必填,最少 6 字。role:
in:admin,receptionist,stylist:只能是這三個值之一(管理員、接待、設計師)。status:
in:active,inactive:只能是 active 或 inactive。HairdressingUser::create([...]):
Hash::make() 加密後才存入,避免明文密碼。hairdressingusers.index 路由(使用者列表)。success,在視圖中可顯示「使用者新增成功!」。public function edit(HairdressingUser $hairdressinguser)
{
return view('hairdressing.users.edit', ['hairdressinguser' => $hairdressinguser]);
}
Route::get('hairdressingusers/{hairdressinguser}/edit', ...)。{hairdressinguser} 的 ID,從 HairdressingUser 模型查出對應記錄,注入到 $hairdressinguser 變數。resources/views/hairdressing/users/edit.blade.php,並帶入該使用者資料。public function update(Request $request, HairdressingUser $hairdressinguser)
{
$request->validate([
'name' => 'required|max:100',
'email' => 'required|email|max:150|unique:mysql_hairdressing.users,email,' . $hairdressinguser->id,
'password' => 'nullable|min:6',
'role' => 'required|in:admin,receptionist,stylist',
'status' => 'required|in:active,inactive',
]);
$data = [
'name' => $request->name,
'email' => $request->email,
'role' => $request->role,
'status' => $request->status,
];
if ($request->filled('password')) {
$data['password'] = Hash::make($request->password);
}
$hairdressinguser->update($data);
return redirect()->route('hairdressingusers.index')->with('success', '使用者資料更新成功!');
}
email 的 unique 規則:
'unique:mysql_hairdressing.users,email,' . $hairdressinguser->id
users 表中要唯一,但允許跟「目前這筆記錄」的 email 相同(排除自己的 ID),否則編輯時不改 email 也會驗證失敗。password:
nullable|min:6:可以不填;若有填,則最少 6 字。$data 陣列,包含基本欄位:name, email, role, status。password($request->filled('password') 為 true):
$data['password']。$hairdressinguser->update($data);:
public function destroy(HairdressingUser $hairdressinguser)
{
$hairdressinguser->delete();
return redirect()->route('hairdressingusers.index')->with('success', '使用者已刪除!');
}
$hairdressinguser->delete(); 從資料庫刪除該筆記錄。HairdressingUser 模型:
$connection = 'mysql_hairdressing' 連到另一個資料庫。$fillable 允許 name, email, password, role, status 大量賦值。password 在模型中設為 $hidden,所以在視圖或 JSON 中不會直接露出明文密碼(而且這裡存的是雜湊值)。明天來說明 畫面跟routes的部分