iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Modern Web

跳脫MVC,Laravel + React 建立電商網站系列 第 19

Day 19 Laravel + React 實戰之路 -4(假資料)

  • 分享至 

  • xImage
  •  

我今天的規劃是 把 關於產品的資料表稍微設定一下。在一個開發之前,我們必須要資料庫有一些假資料,身為一個專業的開發人員,如果被其他人看到在資料庫一個一個的寫假數據看起來很low,所以我們今天來借助框架的好用小工具來幫助我們進行假資料的「播種」

首先在播種之前,我們先來創建一個「工廠」,這個工廠可以想像成:幫助我們定義要塞什麼樣的資料到資料庫之中。
基本上就是工廠裏頭會有模具,之後要播種的時候只要照著這個模具來做就好了的概念。
一樣我們透過指令來產生工廠:

php artisan make:factory ProductFactory

接著我們到工廠裏頭去定義需要塞入的規則:
這裡要注意,我們需要將目標model放到程式碼裡面 protected $model = Product::class;
這樣這個工廠才知道是針對哪個model所設計的模具。
Product的資料表很單純,只有名稱跟敘述視需要塞入的,因此我們就直接給文字並限定字數就好。

ProductFactory

<?php 
namespace Database\Factories; 
use Illuminate\Database\Eloquent\Factories\Factory; 
use App\Models\Product; 
/** 
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Product> 
 */ 
class ProductFactory extends Factory 
{ 
    protected $model = Product::class; 
    /** 
     * Define the model's default state. 
     * 
     * @return array<string, mixed> 
     */ 
    public function definition() 
    { 
        return [ 
            'name' => $this->faker->realText(10,true), 
            'description' => $this->faker->realText(50), 
        ]; 
    } 
}

接下來我們要到Model的地方來寫入hasFactory。
Product
注意:hasFactory 方法將在Database\Factories命名空間中查找類名與模型名匹配且後綴為Factory的工廠來使用。
如果這個規則不適用的話,可以依據官方文件來寫一個newFactory的function來覆蓋,並返回Factory。
因為我們的命名規則是適用的,所以就不用特別調整。

<?php 
namespace App\Models; 
use Illuminate\Database\Eloquent\Factories\HasFactory; 
class Product extends BaseModel 
{ 
    use HasFactory; 
    protected $table = 'products'; 
    protected $guarded = []; 
}

接下來我們要使用播種機了~
透過以下指令來產生seeder檔案:
php artisan make:seeder ProductSeeder

接下來到 ProductSeeder 來設定:
首先,我們一樣要去use Product Model,因為我們要借助Factory來幫我們大量實例化。
接著,我們把資料表清空(可以做,可不做)
然後把資料塞進去,把要塞入的數量寫到count之中。

<?php 
namespace Database\Seeders; 
use Illuminate\Database\Console\Seeds\WithoutModelEvents; 
use Illuminate\Database\Seeder; 
use App\Models\Product; 
class ProductSeeder extends Seeder 
{ 
    /** 
     * Run the database seeds. 
     * 
     * @return void 
     */ 
    public function run() 
    { 
        \DB::table('products')->truncate(); 
        Product::unguard(); 
        Product::factory()->count(30)->create(); 
        Product::reguard(); 
    } 
}

這裡我想補充一下關於:unguard、reguard
基本上Laravel 為了幫助我們更好的保護資料庫安全性,因此有針對"批量給值"這件事情進行保護,而unguard就是取消該安全機制,reguard就是恢復該安全機制。因此我們在factory大量創建資料的時候要先關閉,再開啟。
特別補充:基本上我們也會透過Model的設定來保護特定欄位,如果在model之中設定$fillable這個屬性,代表只能針對fillable設定的欄位進行資料調整。設定$guarded屬性代表保護該欄位,因此在guarded屬性中的欄位則無法進行資料調整。
舉個例子,User Model
直接翻譯,其實就是Code的意思:
1.只有name、email、password這三個屬性可以更新
2.password跟remember_token會被隱藏
3.email_verified_at會被強制轉換型態

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

好的,這時候我們的資料庫有基本的Product資料了,其他的產品相關的表,利用工廠建的話好像會有點複雜XD
我這裡就暫時跳過,我先用手動的方式把資料寫入XD,如果最後有時間我們再回過頭來寫

今天就先到這邊,明天用Laravel來取資料,然後丟給React來顯示基本的畫面列表吧,我還要想一下要怎麼應(硬)用到之前React學到的概念XD


上一篇
Day 18 Laravel + React 實戰之路 -3(基本資料表建置)
下一篇
Day 20 Laravel + React 實戰之路 -5(商品列表)
系列文
跳脫MVC,Laravel + React 建立電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言