想要馬上製作一個成品出來我覺得會有點困難,所以還是來臨摹網路上有名的作品吧,畢竟創造一定始於模仿,有足夠的實力才能做出自己想像中的東西,而我這次選定的目標為 NETFLIX。

將 NETFLIX 的首頁點開,事實上如果打開 Chrome 的 Network 來看進入首頁後的 Request 可以獲得很多資訊,進而更快的揣摩出該網站的架構,但這樣的做法好像又缺乏了一點想像力,所以這次的作品不會利用 Network 來抄答案,完全由自己來做需求及架構分析,映入眼簾的即是非常多的影集可以選擇,很好,前一句話聽起來非常像廢話,就像一個便當吃不夠那就吃兩個一樣廢,但偶爾講講幹話愉悅一下自己也是蠻好的。



觀察一下可以看出每個影集都會被歸納在不同的類型,如這次截圖的範圍就有「榮登本日台灣 TOP 10 節目」、「{帳號名稱},請繼續觀賞」、「最新發行」、「國際節目」、「現正熱播」、「亞洲電影與節目」等各種分類,這時已經可以聯想到至少 2 個 Model 要做了。
接著可以單選影集來觀察更多的資訊


此時可以觀察到同樣在「最新發行」的分類裡卻有兩種不同的顯示模式,經由觀察之後可以發現影集類型的會顯時總集數,而電影類型的會顯示該片總時數,並在向下箭頭則會有不同的提示,其一為「集數與資訊」,其一為「更多資訊」,由此得知影集及電影要記錄不同的資訊,獲得這些資訊之後已經可以先寫一點基本的架構了,由於電影及影集還是有共同的資訊,例如再多集的影集也只會有相同的特徵標籤,如「火熱」、「劇情」、「毒梟」等,所以我打算將片名再往上提一層,影集就是包含多集的影片、而電影則是只有一集的影片,架構如下:
商品(Product):名稱、類型、大綱。
影片(Video):商品id、路徑、前情提要。
特徵(Characteristic):名稱。
分類(Category):名稱。
演員(Actor):名稱。
各個 Model 之間的關聯如下:
商品-影片:一對多
商品-特徵:多對多
商品-分類:多對多
商品-演員:多對多
由於有三個多對多的狀況發生,所以我會選擇多建立三個 Model
商品與特徵關聯(ProductCharacteristic)
商品與分類關聯(ProductCategory)
商品與演員關聯(ProductActor)
php artisan make:model Product -m
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('商品名稱');
$table->unsignedInteger('type')->comment('商品種類');
$table->string('outline')->comment('大綱');
$table->timestamps();
});
protected $fillable = [
'name',
'type',
'outline',
];
php artisan make:model Video -m
Schema::create('videos', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('product_id')->comment('商品id');
$table->string('path')->comment('影片路徑');
$table->string('previously')->comment('前情提要');
$table->foreign('product_id')
->references('id')
->on('products')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
php artisan make:model Characteristic -m
Schema::create('characteristics', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('特徵名稱');
$table->timestamps();
});
protected $fillable = [
'name',
];
php artisan make:model Category -m
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('分類名稱');
$table->timestamps();
});
protected $fillable = [
'name',
];
php artisan make:model Actor -m
Schema::create('actors', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('演員名稱');
$table->timestamps();
});
protected $fillable = [
'name',
];
php artisan make:model ProductCharacteristic -m
Schema::create('product_characteristics', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('product_id')->comment('商品id');
$table->unsignedInteger('chracteistic_id')->comment('特徵id');
$table->foreign('product_id')
->references('id')
->on('products')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->foreign('chracteistic_id')
->references('id')
->on('characteristics')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
protected $fillable = [
'product_id',
'chracteistic_id',
];
php artisan make:model ProductCategory -m
Schema::create('product_categories', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('product_id')->comment('商品id');
$table->unsignedInteger('category_id')->comment('分類id');
$table->foreign('product_id')
->references('id')
->on('products')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->foreign('category_id')
->references('id')
->on('categories')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
protected $fillable = [
'product_id',
'category_id',
];
php artisan make:model ProductActor -m
Schema::create('product_actors', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('product_id')->comment('商品id');
$table->unsignedInteger('actor_id')->comment('演員id');
$table->foreign('product_id')
->references('id')
->on('products')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->foreign('actor_id')
->references('id')
->on('actors')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
protected $fillable = [
'product_id',
'actor_id',
];
今日的篇幅很長,大部分是為了鋪陳明天的開發,基礎地基也都打好了,萬丈高樓明日起,明天見。