iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 6

第 6 天:數據庫操作基礎

  • 分享至 

  • xImage
  •  

認識資料庫


建立資料表

使用 Eloquent 進行基本的 CRUD 操作(創建、讀取、更新、刪除)


Eloquent ORM 是 Laravel 提供的一個 ORM (對象關聯映射)工具,用於與資料庫進行交互。
它提供了一個簡單且直觀的 API 來進行資料的 CRUD (創建、讀取、更新和刪除)操作。

💡 Eloquent: 使用模型進行資料的 CRUD 操作

創建(Create)

use App\Models\Flight;

// 創建並儲存一筆新資料
$flight = new Flight();
$flight->name = 'Flight 101';
$flight->airline = 'Airline Example';
$flight->save();

// 或者使用批量賦值
Flight::create([
    'name' => 'Flight 102',
    'airline' => 'Airline Sample'
]);
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    // 允許批量賦值的欄位
    protected $fillable = ['name', 'airline'];
}

讀取(Read)

use App\Models\Flight;

// 取得所有紀錄
$flights = Flight::all();

// 取得單筆紀錄
$flight = Flight::find(1);

// 取得符合條件的紀錄
$flights = Flight::where('airline', 'Airline Example')->get();

更新(Update)

use App\Models\Flight;

// 查找並更新紀錄
$flight = Flight::find(1);
$flight->name = 'Updated Flight Name';
$flight->save();

// 或者使用更新方法
Flight::where('id', 1)->update(['name' => 'Updated Flight Name']);

刪除(Delete)

use App\Models\Flight;

// 查找並刪除紀錄
$flight = Flight::find(1);
$flight->delete();

// 使用條件刪除
Flight::where('airline', 'Airline Example')->delete();

查詢構建器(Query Builder)的基本使用


查詢建構器(Query Builder)是一種用於構造和執行資料庫查詢的工具,它提供了一個流暢且直觀的 API 來創建 SQL 查詢,而不需要直接撰寫原始 SQL 語句。
Laravel 的查詢建構器可以與各種資料庫系統(如 MySQLPostgreSQLSQLite 等)配合使用,並且支持豐富的查詢功能,包括選擇、過濾、排序和聯接等。

觀察 SQL 指令的方法
file path:app/Providers/AppServiceProvider.php
code:DB::listen(function (QueryExecuted $q) { dump($q->sql); });
觀察SQL的程式碼
貼上畫面顯示的 SQL 語法觀察查詢的結果,貼上語法的路徑:/Library/Application Support/JetBrains/PhpStorm2023.3/consoles/db/f6517b4a-9d68-4875-8266-99d8ff85328c/console.sql
畫面

主要功能:

  • 構造查詢:
    DB::table('flights')
        ->where('status', 'active')
        ->get();
    
  • 流暢接口:方法鏈式調用
    DB::table('flights')
        ->where('status', 'active')
        ->orderBy('departure_time')
        ->get();
    
  • 支持多種資料庫操作:包括 SELECT、INSERT、UPDATE 和 DELETE 操作。

💡 查詢構建器: 使用 DB 類來進行更靈活的 SQL 查詢

基本查詢

use Illuminate\Support\Facades\DB;

// 取得所有紀錄
$flights = DB::table('flights')->get();

// 取得單筆紀錄
$flight = DB::table('flights')->where('id', 1)->first();

// 取得符合條件的紀錄
$flights = DB::table('flights')->where('airline', 'Airline Example')->get();

插入資料

DB::table('flights')->insert([
    'name' => 'Flight 103',
    'airline' => 'New Airline'
]);

更新資料

DB::table('flights')
    ->where('id', 1)
    ->update(['name' => 'Updated Flight Name']);

刪除資料

DB::table('flights')
    ->where('id', 1)
    ->delete();

數據庫種子(Database: Seeding)


文件:Database: Seeding

數據庫種子允許在開發過程中填充資料表以進行測試或預設資料,通常會創建一個 Seeder 類來定義如何填充資料

💡 數據庫種子: 使用 Seeder 類來填充測試或預設資料

以下是從創建開始到執行的相關流程:
step 1 - 創建 Seeder 類
下指令 php artisan make:seeder FlightsTableSeeder 創建,FlightsTableSeeder 這是檔案名稱。

step 2 - 編輯 Seeder 類
database/seeders/FlightsTableSeeder.php 文件中建立資料:

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Flight;

class FlightsTableSeeder extends Seeder
{
    public function run()
    {
        // 插入多筆資料
        Flight::create([
            'name' => 'Flight 104',
            'airline' => 'Seeded Airline'
        ]);

        Flight::create([
            'name' => 'Flight 105',
            'airline' => 'Another Seeded Airline'
        ]);
    }
}

step 3 - 執行 Seeder
下指令 php artisan db:seed --class=FlightsTableSeeder 執行

step 4 - 執行所有 Seeders
database/seeders/DatabaseSeeder.php 建立函數:

public function run()
{
    $this->call(FlightsTableSeeder::class);
}

然後下指令 php artisan db:seed 執行

✍🏻 每日任務


請嘗試用 seeder 的方法間把以下測試資料加進去 users 表格中
測試資料:

            [
                'name'     => 'monica',
                'email'    => 'aa@asd.com',
                'password' => Hash::make('123')
            ],
            [
                'name'     => 'kuku',
                'email'    => 'bb@asd.com',
                'password' => Hash::make('123')
            ]

step 1 - 創建 Seeder 類
指令 php artisan make:seeder UsersTableSeeder
step 2 - 編輯 Seeder 類
打開建立的 UsersTableSeeder
編輯UsersTableSeeder
step 3 - 註冊 Seeder 類
回到 database/seeders/DatabaseSeeder.php,註冊 UsersTableSeeder

run 會在執行 db:seed 這個 Artisan command 時被調用
call 方法來運行其他的 seed 類

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

// 註冊 Seeder
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call([UsersTableSeeder::class]);

        // \App\Models\User::factory(10)->create();

        // \App\Models\User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);
    }
}

step 4 - 執行 Seeder
指令 php artisan db:seed
畫面新增2筆資料

step 5 - 彩蛋(使用模型工廠)

  • 使用模型工廠
    在 Seeder class 中改用模型工廠,可以一次大量建立很多筆資料
        public function run(): void
        {
            User::factory()->times(20)->create();
        }
    
    模型工廠建立
  • 使用檢索或建立模型避免重複
        public function run(): void
        {
            // 查找記錄,如果找到記錄,則更新該記錄;如果未找到記錄,則創建一個新記錄
            User::query()->updateOrCreate(
                ['email' => 'girl@example.com'],            // 查找條件
                [
                    'name'     => 'girl',
                    'password' => Hash::make('123')
                ]                                           // 變更內容
            );
    
            // 查找記錄,如果找到記錄,則返回該記錄;如果未找到記錄,則創建一個新記錄並返回
            User::query()->firstOrCreate(
                ['email' => 'boy@example.com'],             // 查找條件
                [
                    'name' => 'boy',
                    'password' => Hash::make('123'),
                ]                                           // 變更內容
            );
        }
    

上一篇
第 5 天:數據模型與遷移
下一篇
第 7 天:集合 - 基礎概念
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:02:39

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:35:23 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:05:24

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:35:29 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:06:52

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:35:36 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:10:39

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:35:44 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:19:39

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:35:06 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:27:23

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:34:52 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

0
kuku
iT邦新手 4 級 ‧ 2024-09-29 22:29:04

延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction 功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。

文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID

kuku iT邦新手 4 級 ‧ 2024-09-29 22:33:45 檢舉

運氣超好,系統當機連發 7 次,真的超幸運

我要留言

立即登入留言