更新於 2024/12/16閱讀時間約 10 分鐘

Laravel (從Seeder到視圖展示)

在本篇文章中,我們將深入探討如何在 Laravel 中建立關聯資料、使用 Eloquent ORM 操作資料庫,並將資料傳遞到前端視圖。這篇文章將涵蓋從資料庫遷移、Seeder、關聯模型的建立,到資料傳遞的完整流程,並介紹如何在前端展示資料。無論你是 Laravel 新手還是有經驗的開發者,都能從這篇文章中獲得有價值的學習資源。



1. 處理 Eloquent 關聯:belongsTohasMany

在 Laravel 中,我們使用 Eloquent ORM 來處理資料間的關聯。常見的關聯包括 belongsTohasMany,分別代表一對多的反向關聯和多對一的關聯。

1.1. belongsTohasMany 關聯

當我們希望從子模型查詢父模型時,我們會使用 belongsTo,而當我們希望從父模型查詢多個子模型時,我們會使用 hasMany。以下是這兩種關聯的範例:

Movie 和 MovieType 之間的 belongsTohasMany 關聯

// Movie 模型:定義與 MovieType 的 belongsTo 關聯
class Movie extends Model
{
public function movieType()
{
return $this->belongsTo(MovieType::class);
}
}

// MovieType 模型:定義與 Movie 的 hasMany 關聯
class MovieType extends Model
{
public function movies()
{
return $this->hasMany(Movie::class);
}
}

1.2. 使用 with 方法載入關聯

我們可以使用 Eloquent 的 with 方法來同時載入關聯資料,這樣可以避免 N+1 查詢問題。以下範例展示如何使用 with 方法載入電影類型(movie_types)資料:

$movies = Movie::with('movieType')->get();
foreach ($movies as $movie) {
echo $movie->name . ' - ' . $movie->movieType->name . "<br>";
}

這樣會一次性查詢所有的電影資料並同時查詢它們對應的電影類型資料。


2. 使用 nullable() 設定資料表的預設值

有時候,我們希望資料表的某些欄位允許空值。Laravel 提供了 nullable() 方法來設置欄位允許空值。

2.1. 在遷移中設置 nullable

假設我們有一個 movies 資料表,其中有 release_date 欄位。如果我們希望此欄位可以為空,我們可以在遷移中使用 nullable() 設置該欄位:

// 遷移文件:設置 release_date 欄位為 nullable
Schema::table('movies', function (Blueprint $table) {
$table->date('release_date')->nullable()->default(null);
});

這樣,release_date 欄位將允許空值。


3. 傳遞資料到前端

在 Laravel 中,控制器負責將資料傳遞到視圖。下面我們展示如何將資料從控制器傳遞到前端並在視圖中顯示它。

3.1. 在控制器中傳遞資料

在控制器中,我們可以使用 compact 函數將資料傳遞給視圖:

$movies = Movie::with('movieType')->get();
$data = $movies->map(function($movie) {
return [
'id' => $movie->id,
'name' => $movie->name,
'typeName' => $movie->movieType->name ?? '',
];
});

return view('movieView', compact('data'));

3.2. 在 Blade 視圖中顯示資料

在 Blade 視圖中,我們可以使用 @foreach 迴圈來顯示資料:

<div id="container">
@foreach ($data as $movie)
<p>{{ $movie['name'] }} - {{ $movie['typeName'] }}</p>
@endforeach
</div>

這段程式碼會遍歷 $data 並顯示每部電影的名稱和電影類型。


4. 建立並執行 Seeder

Laravel 提供了 Seeder 來填充測試資料到資料庫。下面我們將展示如何創建一個 MovieTypeSeeder 來填充電影類型資料。

4.1. 創建 Seeder

使用 Artisan 命令來創建 Seeder:

php artisan make:seeder MovieTypeSeeder

接著,在 MovieTypeSeeder 中添加我們的資料:

<?php

namespace Database\Seeders;

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

class MovieTypeSeeder extends Seeder
{
public function run()
{
$data = [
['name' => '動作', 'color' => '紅'],
['name' => '冒險', 'color' => '綠'],
['name' => '奇幻', 'color' => '藍'],
['name' => '搞笑', 'color' => '橘'],
['name' => '科幻', 'color' => '紫'],
];

foreach ($data as $value) {
MovieType::create($value);
}
}
}

4.2. 執行 Seeder

接下來,執行 Seeder 填充資料:

php artisan db:seed --class=MovieTypeSeeder

4.3. 執行全部 Seeder

如果我們希望執行所有 Seeder,可以在 DatabaseSeeder 中調用其他 Seeder:

public function run()
{
$this->call([
MovieTypeSeeder::class,
// 可以在這裡調用其他 Seeder
]);
}

接著,執行所有 Seeder:

php artisan db:seed


5. 資料庫操作的最佳實踐

5.1. 清空資料庫並重新執行 Seeder

在開發過程中,我們可能需要清空資料庫並重新執行 Seeder。可以使用以下命令來刪除資料庫中的所有資料並重新執行遷移和 Seeder:

php artisan migrate:fresh --seed

這會清空所有資料表,重新執行所有的遷移並執行 Seeder 填充資料。

5.2. 密碼雜湊

Laravel 使用 bcrypt 函數來將密碼進行雜湊處理,保證資料的安全性。在使用 create()update() 方法時,應該確保密碼欄位被正確雜湊。


6. 結論

這篇文章展示了如何在 Laravel 中建立和操作關聯資料,並將資料從後端傳遞到前端。學習了如何使用 Eloquent ORM 來處理關聯資料、使用 nullable() 設置資料欄位的預設值、以及如何創建和執行 Seeder 填充資料庫。在實際開發中,這些技術可以幫助你更有效地管理資料庫,並讓你能夠快速展示資料。

透過這些技巧,你將能夠更輕鬆地管理大型應用的資料結構,提升開發效率,並確保資料處理的安全性和可靠性。接下來會介紹合併Vue和Laravel。


對於這類的撰寫方式習慣嗎?歡迎多多進行良性的知識交流喔!目前是在學習階段,大家有不同看法的話歡迎進行良性的知識交流!

 

大家可以考慮多多分享文章和考慮訂閱沙龍方案或贊助等喔!不過請注意不要違反著作權等行為。當然決定權都在於您,不會干涉您的任何決定。

 

提醒,文章僅供正當的知識參考,文章不負任何責任。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.