# Laravel
## 建立新專案
1. 先到/usr/share/nginx/html/ 此目錄下
`cd /usr/share/nginx/html/`
2. 每建一個專案都要裝一次laravel
```
composer create-project laravel/laravel="9.*" --prefer-dist test
ex.9.*指的是版本 test 是專案名稱
```
3. 在/etc/nginx/conf.d/ 裡面建立一個跟專案同名的.conf檔
`設定port號,root路徑改成專案路徑`
4. 開port
`semanage port -a -t http_port_t -p tcp 85`
5. nginx要重啟
`systemctl restart nginx`
6. 給nginx存取專案目錄權限
`chown nginx:nginx -R 專案路徑`
7. http讀取權限
`chcon -R -t httpd_sys_content_t 專案路徑`
8. http寫入權限
`chcon -R -t httpd_sys_rw_content_t 專案路徑`
9. 給nginx最大權限
`chmod -R 777 /usr/share/nginx/html/test2/`
5~9步驟如下圖

如果出現Permission denied的問題,試著關閉SELinux

## 建立migrations
```php
php artisan make:migration create_資料表名稱_table
php artisan migrate 建立資料表
php artisan migrate --path=/database/migrations/文件名.php。
```
安裝Node.js
yum install nodejs
安裝NPM
sudo yum install npm
## 建立Model
`php artisan make:model Model名稱`
## 建立Controller
`php artisan make:controller 名稱開頭大寫 --resource `
## 一次建立Mdel、Mirgation、Controller
`php artisan make:model 名稱 -rmc`
## 只執行單一seed
`php artisan db:seed --class=YourSeederClassName`
## laravle 新增Resources
`php artisan make:resource MyResource`
## 新增policy
`php artisan make:policy PostPolicy --model=Post`
## 存圖片檔案路徑到資料庫
設定檔案存取權限:為了讓上傳的檔案可以被瀏覽器訪問,需要設定檔案存取權限。可以使用以下 Artisan 指令來建立符號連結並設定存取權限:
`php artisan storage:link`
```php=
if ($request->hasFile('image')) {
$image = $request->file('image')->store('public');
$url = Storage::url($image);
} else {
$url = '';
}
```
## 刪除硬碟資料
```php=
$report = Report::find($id);
if (!isset($report)) {
$message = ['msg' => ['沒有這筆資料可以刪除']];
return response($message, 200);
} else {
$file_name = substr($report['image'], 32);
Storage::disk('public')->delete($file_name); //刪除檔案
$report->delete();
$message = ['msg' => ['資料刪除成功']];
return response($message, 200);
}
```
## 檔案分頁
```php=
$pageNum = $request->page;
$limit = 10;
$page = $pageNum - 1;
if ($page != 0) {
$page = $limit * $page;
}
$data = Report::offset($page)->limit($limit)->orderBy('created_at', 'desc')->get(); //第幾頁 從第幾筆開始 照時間排序(最新的在上面)
$count = Report::count(); //計算資料總筆數
$totalpage = ceil($count / $limit); //計算總頁數
return response([
'page' => $pageNum,
'totalpage' => $totalpage,
'totalreport' => $count,
'data' => $data
]);
```
## 抓取用戶端IP
```php=
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$result = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$result = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
$result = $_SERVER['HTTP_X_FORWARDED'];
} elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$result = $_SERVER['HTTP_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_FORWARDED'])) {
$result = $_SERVER['HTTP_FORWARDED'];
} else{
$result = '';
}
return response($result);
```
敏雄大神..
```php=
return request()->ip();
```
https://learnku.com/articles/38375
## 錯誤時執行回滾
在 Laravel 中,DB::beginTransaction() 方法啟動一個新的資料庫事務。你可以在該方法之後進行一系列的資料庫操作,如果其中任何一個操作失敗,那麼整個事務就會被回滾,所有已經執行過的操作都會被撤銷,資料庫的狀態就回到事務開始之前的狀態。如果所有操作都成功,那麼你可以調用 DB::commit() 方法來提交事務,從而讓所有的操作生效。
```php=
use Illuminate\Support\Facades\DB;
DB::beginTransaction();
try {
// 在這裡進行一系列的資料庫操作
DB::table('users')->update(['active' => true]);
DB::table('orders')->delete();
// 如果所有操作都成功,就提交事務
DB::commit();
} catch (\Exception $e) {
// 如果任何一個操作失敗,就回滾事務
DB::rollback();
}
```
## 安裝excel
https://docs.laravel-excel.com/3.1/getting-started/installation.html
## 安裝或新增文件後
composer dump-autoload
--------------------------------------------------
## `json_decode()`
當你從外部獲取的資料是 JSON 格式時,你需要將它轉換為 PHP 中的陣列或物件,以便於在程式中進行操作。這就是 `json_decode()` 函數的作用。讓我們來詳細說明它的用法:
-
### `json_decode()` 函數的語法:
```php
mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] )
```
### 參數說明:
- `$json`:要解碼的 JSON 字串。
- `$assoc`:當此參數設置為 `true` 時,將返回陣列形式;設置為 `false` 或省略時,將返回物件形式。預設為 `false`。
- `$depth`:可選參數,指定解碼過程中允許的最大深度。預設為 `512`。
- `$options`:可選參數,指定解碼選項。詳細信息可以參考 PHP 官方文件。
### 實例演示:
假設我們有一個 JSON 字串如下:
```json
$jsonString = '{"name": "John", "age": 30, "city": "New York"}';
```
現在,我們使用 `json_decode()` 函數將其轉換為 PHP 中的陣列或物件:
```php
// 解碼為關聯陣列形式
$array = json_decode($jsonString, true);
// 解碼為物件形式
$object = json_decode($jsonString);
```
現在,我們可以透過訪問陣列或物件的方式來獲取資料:
```php
// 訪問陣列形式的資料
echo $array['name']; // 輸出:John
echo $array['age']; // 輸出:30
echo $array['city']; // 輸出:New York
// 訪問物件形式的資料
echo $object->name; // 輸出:John
echo $object->age; // 輸出:30
echo $object->city; // 輸出:New York
```
這樣,我們就成功地將 JSON 字串解碼為 PHP 中的陣列或物件,並且可以方便地訪問和操作其中的資料。
------------------------------------------
## JSON 字串
JSON 字串是一種資料交換格式,用於在不同程式之間傳遞資料。JSON 是 JavaScript Object Notation 的縮寫,它是一種輕量級的資料交換格式,易於理解和使用。JSON 字串由一系列鍵值對組成,並使用大括號 `{}` 包圍。每個鍵值對之間使用逗號分隔。
以下是一個 JSON 字串的例子:
```json
{
"name": "John",
"age": 30,
"city": "New York",
"is_student": false,
"grades": [90, 85, 95]
}
```
這個 JSON 字串描述了一個包含名字、年齡、城市、是否是學生以及成績的資料。
- `name`、`age`、`city`、`is_student` 是鍵,它們是字串類型的值。
- `grades` 是一個鍵值對,它的值是一個陣列,包含多個數字。
JSON 字串的主要特點包括:
1. 易於閱讀和理解。
2. 支持多種數據類型,包括字串、數字、布林值、陣列和物件。
3. 與大多數程式語言兼容,可以在不同程式之間輕鬆傳遞資料。
4. 是現代 Web 開發中常用的資料交換格式之一。
總之,JSON 字串是一種用於在不同程式之間傳遞資料的輕量級、易於理解和使用的格式。
---
## 產生序號
```php=
static function createUniqueSeriennummer(){
$s = Str::random(20);
if (Seriennummer::where('seriennummer', $s)->exists())
return self::createUniqueSeriennummer();
else
return $s;
}
```
根據您提供的程式碼片段,`$result->items()` 可能是從某個結果或資料集中取得一個陣列 `$items`。這個陣列中的每個元素都是一個物件或關聯式陣列,代表查詢結果中的一行資料。
如果使用 Laravel Eloquent 或 Query Builder,這些資料通常會是模型物件或關聯式陣列,具體取決於您使用的方法和設定。如果使用原始 SQL 查詢或其他資料庫操作,則可能會是純粹的關聯式陣列。
因此,您可以透過 `var_dump($items)` 或 `dd($items)` 來查看 `$items` 的資料格式。這樣可以確定每個元素是什麼類型,以及可以存取哪些屬性或索引。
舉例來說,如果 `$items` 是模型物件的集合,您可以這樣存取其中的屬性:
```php=
foreach ($items as $item) {
echo $item->id; // 存取模型物件的 id 屬性
echo $item->serialNumber; // 存取模型物件的 serialNumber 屬性
// 其他屬性存取
}
```
如果 `$items` 是關聯式陣列,則可以這樣存取其中的值:
```php=
foreach ($items as $item) {
echo $item['id']; // 存取關聯式陣列的 id 鍵值
echo $item['serialNumber']; // 存取關聯式陣列的 serialNumber 鍵值
// 其他鍵值存取
}
```
請根據您的程式碼和使用情境確定 `$items` 的資料結構,以便正確存取資料中的值。
---
### 轉成json格式,但中文正常顯示
return json_encode($data,JSON_UNESCAPED_UNICODE);
---
### create()、insert()、save() 完整對比
好問題!這邊幫你把 Laravel ORM 中常見的三種新增資料方式:create()、insert()、save() 做個完整對比,幫你更清楚知道什麼情境該用哪一個。
⸻
🔁 基本介紹
方法 類型 是否回傳 Model 是否跑 Model 事件 是否跑 timestamps 適用情境
create() Eloquent 方法 ✅ 是 ✅ 是 ✅ 是 快速新增一筆
insert() Query Builder ❌ 否(回傳 bool) ❌ 否 ❌ 否 快速大量新增
save() Eloquent 方法 ✅ 是 ✅ 是 ✅ 是 單筆儲存/更新
⸻
✅ 1. create():用陣列直接新增
```php=
User::create([
'name' => 'Tom',
'email' => 'tom@example.com',
]);
```
條件:
• Model 內必須設好 $fillable 或 $guarded
• 會自動處理 created_at / updated_at
• 會觸發 creating / created 等 model 事件
⸻
✅ 2. insert():快速插入一或多筆(不跑任何 Eloquent 邏輯)
```php=
User::insert([
['name' => 'Amy', 'email' => 'amy@example.com'],
['name' => 'Ben', 'email' => 'ben@example.com'],
]);
```
特色:
• 不能自動處理 timestamps(要自己加欄位)
• 不會檢查 $fillable
• 不會觸發任何事件
• 回傳值是 true/false
• 適合大量匯入(速度快)
⸻
✅ 3. save():先建 model 實例再呼叫 save()
```php=
$user = new User;
$user->name = 'John';
$user->email = 'john@example.com';
$user->save();
```
特色:
• 適合當你是「一筆筆動態處理」的情況
• 同樣會處理 timestamps、觸發事件
• 如果已經有主鍵值,save() 會變成 更新 而不是新增
也可寫成:
```php=
$user = new User([
'name' => 'John',
'email' => 'john@example.com',
]);
$user->save();
```
⸻
🔍 差異比較表:
功能 create() save() insert()
是否用 Eloquent 模型 ✅ ✅ ❌(底層 Query)
是否檢查 $fillable ✅ ❌ ❌
是否自動 timestamps ✅ ✅ ❌
是否觸發 Model 事件 ✅ ✅ ❌
是否可批量新增多筆資料 ❌ ❌(需自己迴圈) ✅
回傳內容 Model 實例 Model 實例 true/false
⸻
✅ 總結選用建議:
情境 建議用法
新增一筆、簡單表單儲存 create()
批次匯入資料、效能優先 insert()
一筆一筆資料有邏輯要先組裝、或有 update 機會 save()
⸻
如果你是做使用者註冊、單筆資料儲存,建議用 create() 或 save()。如果你是從 Excel 匯入大量資料,建議用 insert()。
### save()如何使用更新
很好,這是 Laravel ORM 中 save() 的一個非常常見用途:「根據主鍵更新一筆資料」。
⸻
✅ save() 如何執行「更新」?
save() 方法會根據 Model 物件是否有主鍵(通常是 id)來決定要「新增」還是「更新」。
⸻
📌 使用方式:更新資料
```php=
$user = User::find(1); // 先撈出 ID 為 1 的資料
$user->name = '新的名字';
$user->email = 'new@example.com';
$user->save(); // 執行更新
```
💡 注意:
• 如果找不到那筆資料(例如 User::find(999) 回傳 null),就不能呼叫 $user->save()。
• 會自動更新 updated_at 欄位。
• 會觸發 model 的事件:updating, updated
⸻
✅ 用 updateOrCreate() 也可以達到類似效果:
如果你想「有就更新,沒有就新增」可以用:
```php=
User::updateOrCreate(
['email' => 'test@example.com'], // 條件
['name' => '更新或新增的名字'] // 要更新的欄位
);
```
⸻
✅ 手動建立物件再更新(不從資料庫撈):
如果你已知某筆資料的主鍵,也可以這樣:
```php=
$user = new User;
$user->id = 1; // 指定主鍵
$user->name = '新名';
$user->exists = true; // 告訴 Laravel:這不是新資料,是已存在的資料
$user->save(); // 更新 id = 1 的資料
```
🔥 關鍵在 exists = true,這會讓 Laravel 把 save() 當成更新,而不是新增。
⸻
✅ 總結:
操作方式 結果
有主鍵、從 DB 撈出資料 → 修改 → save() ✅ 更新資料
沒有主鍵、用 new 建立新物件 → save() ✅ 新增資料
手動設 id 並設定 exists = true ✅ 更新指定資料
---