---
# System prepended metadata

title: Laravel

---

# 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步驟如下圖
![](https://i.imgur.com/qGjEe10.png)

如果出現Permission denied的問題，試著關閉SELinux
![](https://hackmd.io/_uploads/BJRbrMhdh.jpg)



## 建立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	✅ 更新指定資料

---