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