logo

Laravel從入門到就業

  • 無評分
  • (0 評論)
  • 7 學生入學

Laravel從入門到就業

從入門到就業的手把手影片教學

  • 無評分
  • (0 評論)
  • 7 學生入學
  • NT$14980
  • NT$28960
14天內保證退費
  • 課程包含
  • 工程師應聘指南
  • 後台自動生成技巧
  • Laravel核心知識
  • Laravel 實戰攻略
  • API 端點開發指南
標籤:



您將學到什麼

  • 如何應聘工程師工作機會
  • 如何用 Laravel 來開發 API 端點
  • 如何進行專案的版本控管
  • 如何自動化測試程式碼
  • Laravel 架構的核心知識

課程內容

10 sections • 138 lectures • 總長為20時14分
歡迎與自我介紹

各位學員大家好

歡迎加入 Laravel 百萬年薪特訓營

我是哥布林工程師,也是這堂課程的導師

我知道每個人都作出了犧牲,不管是時間還是金錢,但我向你保證這絕對是個正確的決定

所以我在此恭喜你即將更快的得到百萬年薪

這是一個非常有系統性的課程

我已經把學習網頁程式開發的相關知識

按照先後順序把課程規劃出來了

你所要做的

就是按照課程給你的順序一一的去聽完

並且最重要的就是一定要練習

你可以一邊上課一邊操作

或者是把該單元看過一遍再操作都可以

根據自己的學習喜好來安排即可

這是你自己的決定

但重要是一定要練習

否則學習效果將會大打折扣

給自己打個氣,告訴自己一定可以的

準備開始你的學習旅程吧

我們下個單元見

1分
實作問題排除方案
3分
加入 Laravel Care 計畫

這一堂課是要告訴身為學員的你

能夠免費加入 Laravel Care 學習陪伴計畫

這個計畫提供你幾項服務

服務一 你能夠加入"Laravel網頁極速開發術"

這是一個臉書上的封閉社團

當你遇到 Laravel 相關的問題時,可以到這裡來尋求協助

我和其他的會員都很樂於協助你解決問題

加入的步驟如下(未按照以下步驟提供完整資料將暫緩處理):

  • 1.確認你的臉書帳號有大頭貼(無頭像的帳號將暫緩處理)

  • 2.發送 Email 到 info@goblinlab.org

    Email標題:申請加入 Laravel 網頁極速開發術

    Email內文:請提供購買方案所使用的Email

    Facebook個人檔案的連結網址

    付款證明截圖或照片

  • 3.至以下網址申請加入社團

    https://www.facebook.com/groups/laravelcare/

  • 4.申請時請確實填寫你購買課程時所使用的Email

  • 5.我們會在24小時內審核你的申請

  • 6.加入社團後第一件事請先閱讀公告區的社團規則以免被踢出社團

注意:同一個購買Email只允許一個臉書帳號加入社團

另外,我也會把會員比較常問的一些問題整理到課程平台的常見問題

這也是會員資格才得以進入的

如果我發現你的問題在課程平台的常見問題裡面已經有了的話

就會提醒你到課程平台來進行學習

服務二 實戰工作坊

我們每週會不定期舉辦會員工作坊

非 Laravel Care 需要付費參加,否則無法進到課堂內

而你是可以不限次數的參加所有的工作坊

每週工作坊的主題與時間將會發送到你訂閱的 Email 裡頭

請記得完成驗證才能確保收到通知

服務三 好康工作情報

我們與多間公司有產學合作計畫

如果有任何優質工作或外包機會

我們將優先透過 Email 的方式發佈給所有的學員搶先知道

以上就是我們 Laravel Care 所有的服務

所以趕緊加入我們 Laravel Care 服務計畫吧

我們下個單元見 掰掰

2分
免責聲明
2分
給自己一個短期學習目標

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我想要邀請你一起

給自己一個短期學習目標

你可能會覺得很奇怪為什麼不是馬上開始學程式

而是要和你討論短期學習目標

我有 3 個理由來說服你

理由 1

沒有學習目標你將不知該何去何從

如果你每天出門前事先就會規劃好要去哪裡

那麼學 Laravel 不也該如此嗎

理由 2

好的學習目標能夠刺激你持續的往前走

比如我之前為了想要學習 Roblox 遊戲開發

就設定要參加痞客邦的鐵人賽

決定完成 30 個影片教學

結果我不但做到了甚至還超出了這個目標很多

理由 3

看著目標能協助你持續修正方向

當你在深山中迷路時去問問生存專家

他會告訴你如何利用太陽來訂出方向

希望這 3 個理由就足以說服你去訂出學習目標

我當然可以想出 100 個理由來繼續說服你

因為我真的想不到任何理由不去訂定目標

所以請你想想在 Laravel 百萬年薪課程這麼多的單元中

哪些是你想要先學會的

是 Laravel 基礎觀念嗎

是資料庫串接嗎

是 API 開發嗎

還是 CRUD 功能實作

還是我最喜歡的後台自動生成技術

這個單元的作業

請你選擇一到兩個作為主攻

訂出自己這個月的學習目標

勿忘練習才是學習程式最好的方法

我們下個單元見,掰掰

6分
建立自己的就業目標

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元是想提醒你

在開始學習 Laravel 前,最好先建立自己的就業目標

除非你學習的目標只是為了樂趣

否則設定好目標對於成功來說至關重要

想清楚你想進到怎麼樣的公司

想挑戰什麼樣的工作

那你也就能設定出自己的學習地圖

要建立就業目標請先問自己幾個問題

我想幫助哪種產業的公司

透過我已具備或將具備的哪種技術

來達到怎樣的成果

比如我會設定這樣的就業目標

我想幫助雲端新創公司

透過 Voyager 以及 Laravel 的結合

來讓我所服務的公司具有更快的開發速度以及更彈性的架構

我知道有些朋友可能不太知道該如何選擇目標

這裡我也提供一些思路供你參考

方向1 你可以觀察產業機會

在你的周圍你發現有哪些公司正在成長

哪些公司大舉招聘軟體工程師

又是哪些題材很容易拿到投資方的錢

這都是一個徵兆說明該公司可能深具潛力

如果你問我推薦哪些產業

我首推金融產業

因為 Fintech 正在改變這個產業

它能提供你優於其他產業的起薪

工作上也相對穩定

接著我推薦醫療產業

這產業正因人工智能與疫情散佈而迎來快速的發展

可預見的未來我們看診將不需要再到診所

可直接在線上進行診斷

接著我也推薦教育產業

因為疫情的關係學生被迫改用線上的方式來進行學習

無紙化正加速發生著

而這將不只是教學工具的改變

而是教育思維的整個顛覆

學生可以自己決定想要聽哪個單元

而講師也將從教授知識轉成教練來協助學生解決問題

而要承接這些改變的軟體設施都還沒完備

方向2 你可以思考自己喜歡的職涯

你喜歡穩定的工作

還是更喜歡充滿挑戰的工作

你喜歡起薪高

還是你希望能有更高的加薪幅度

你喜歡寬敞舒適的工作環境

還是喜歡某些公司的企業文化

假如你希望穩定那麼金融產業或者是中鋼可能是你的菜

如果你有一顆不安分的心

新創一人多職的特性能讓你快速成長起來

假如你喜歡有較高的起薪

金融與電子產業可以滿足你

但如果你希望有更高的加薪幅度

最好搭配產業發展一起去思考

如果喜歡寬敞舒適的工作環境

大公司會比較能滿足你

方向3 評估自己的興趣或經驗

當你所選擇的產業是你感興趣的

往往就能堅持挺過青澀的新人時期

你可以靜下心來想一想曾經做了什麼事情讓你覺得快樂

我曾經有一年為了想飛去中國看看女朋友

卻因為颱風的關係導致飛機改隔天才飛

結果那一晚我沒去找飯店而是就待在候機大廳

寫了一整晚的程式

雖然只是寫些簡單的九九乘法和印星星

但還是讓我覺得非常有成就感

才讓我確認下半輩子都要和程式膩在一起

假如你真的想不出有什麼興趣

那麼把工作當興趣可能也是一種選擇

那你可以根據之前做過哪些產業來構想

比如假如你曾經做過餐飲服務業

那麼 FoodPanda 肯定會對你感興趣

假如你曾經擔任過賣家

那麼 PC Home 肯定願意給你個機會

因為程式技能可以透過好的系統來培養

但是產業 Know How 則需要時間才能累積

方向 4 總結自己的技術優勢

這裡所說的技術倒不見得指的是程式

而是你綜合的能力

可以是行銷或管理

也可以是影片製作或文案撰寫

思考自己的技能組是哪種類型的公司最需要的

說到這裡我知道還是會有些人想問

我一定得先選擇某個產業才行嗎

我必須說知己知彼才能百戰百勝

因為你是不可能同時研究完所有產業或公司

而且在求職準備章節

我也將建議你儘量多投相同的產業

這不單能讓你更有勝算

在談薪資時也能有更多的空間

我也知道你可能會擔心自己目前的實力可能不太夠

請你放心

Laravel百萬年薪特訓營所教的內容範圍

絕對足夠初階工程師工作所需

只要把所有單元的知識都能掌握並透過 Side Project 來練習

也就是想一些作品方向來實踐

你絕對也可以擁有去面試工程師的實力

最後一個大家會想問的問題是

我為什麼又怎麼會知道該達到怎樣的成果

這問題很簡單

一旦你做好產業與公司的功課,就會知道這家公司的痛點

當了解公司的痛點,你就有了談判的支點

而解決甚至讓痛點變成強點,就是你可以提的成果

這個單元的作業

請根據上一堂課的課程目標與這 4 個方向

進一步規劃自己的就業目標

我們下個單元見,掰掰

3分
應徵大骨牌理念

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元要來聊聊你的應徵大骨牌理念

這與之前所談的就業目標有點類似

但對象卻完全不同

之前的就業目標是可以在人資面前分享的

而大骨牌理念則是用來增強你的信心

只要告訴自己就好

而大骨牌的要素有三個

分別是想進入的公司是什麼

而這些公司又面臨著怎樣的痛點

再加上我目前最熟悉的技能組有哪些

整個大骨牌唸起來像是這樣的

如果我能讓我想進入的公司相信

要解決他們現在所面臨的痛點

最好的方式就是我目前最熟悉的技能

而且要能達到那個目標

最快速的方式就是錄取我

既然如此

那所有人資與用人單位的問題都已經無關

而且他們必須要錄取我

那這麼我舉個例子來示範

在 104 人力銀行我找到了這一個 Laravel 職缺

阿珥楠股份有限公司有一個產品叫租租通

根據它的職缺描述可以發現

它有特別列出開發過程中的每一個具體流程

並希望員工能夠進行團隊合作

假如我對租租通這個產品感興趣的話

我就會在自己的筆記裡頭寫下這段大骨牌

如果我能讓租租通相信

要順暢的運行從開發.測試到重構的整個流程

最好的方式就是高效而優美的 Laravel 開發架構

而且要達到這個開發流程的目標

最快速的方式就是錄取我

那人資與用人單位的問題都已經無關

而且他們必須錄取我

這個單元就到這邊

你的作業就是根據上個單元的作業

來構想你的大骨牌並寫在筆記本中

告訴自己你心儀的公司正等著你去應徵喔!

3分
學習程式成功還是失敗的兩大關鍵

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我想和你聊聊

我在這十年發現多數人在學習程式時

成功或者是失敗最大的兩個關鍵原因

一旦你了解了這兩個關鍵

就能讓自己趨吉避凶

提高你學成 Laravel 的機率

我相信多數的我們都有過學習程式的經驗

但多數人最終都失敗了只有少數人能學會

想一想你之前是怎麼去學習程式語言的

你或許是透過 Google 來尋找免費資源自學

也或許你是透過其他的線上課程來看影片學習

之前很多人也會買電腦書來學習

甚至是花了大價錢去電腦補習班去上課

但實際上這些方法都有各自的缺點

比如免費資源看似不用成本就能學

但因為沒有系統化的暸解

很容易深陷局中

只是看影片跟著打程式碼

往往遇到問題卻無法可協助而導致卡關

至於買書不但有同樣的問題

更常見的是因為有過多的細節

導致你覺得見樹不見林

不確定自己到底學到了什麼而提早放棄

電腦補習班或許是比較好的選擇

我當初也是透過資策會來建立程式的基礎

但這也是得看這家補習班的辦學理念

授課老師的技能水平等等不一而定

但補習班鮮少會引導你去進行實作練習

遇到問題也不會有太多的時間來協助你

而這些缺點就帶出了我想和你分享

學習程式成功的兩大關鍵

分別是好的引路人以及實作

什麼是引路人呢

他應該是擅長指導的講師

必須對你想學的技術有整體的思路

而且能夠協助你去解決問題

就我所知道因為這個關鍵而放棄是最可惜的

因為這群人投入了大量的努力但因為無人可問

始終走不出來最後只好放棄

但他很可能明明已經走到了最後一關

即將就要破局而出

而更多的人則是只聽程式課但卻沒把手弄髒

開始寫自己的程式碼

我建議你在實作時最好讓主題有點難度但你可以完成

並且其範圍足以用到所有你學到的知識

當作品完成後記得把它公開到網路上給其他人

最重要的是作品主題最好和自己的興趣相符

比如我學習 Java 時的第一個實作練習

就是製作美女照片牆

當我看到最終成品完成時

過程中的所有坎坷突然都變得那麼甜美

這個單元你有兩個作業

首先請你想一想

在你身邊有誰可以擔任你的引路人

打個電話給他用盡一切方法說服他來幫助你

如果沒有的話也沒有關係

你還有我和其他會員唷

另外一個作業也請你想想

根據自己所規劃的短期學習目標

來想像自已可以規劃一個怎樣的實作題目

這個單元就到這裡,掰掰

4分
不完美行動與分享

你好,歡迎回到 Laravel 百萬年薪特訓營

在上個單元我們聊過成功或失敗的兩大關鍵

我很想知道你是否開始行動

找出自己的引路人並制定實作主題了呢

假如還沒有的話

那麼這個單元就是為你而準備的

如果我問你一個問題

為什麼我們總是習慣等待並拖延行動的時機

你覺得是什麼

有些人會說覺得自己還不夠成熟

沒有自制力與執行力

也有些人覺得時間還未到等明天再說

但就我對自己的觀察

原因往往就在於不想離開自己的舒適圈

你如果問任何一個激勵或成功大師

什麼時候是你開始行動的最好時機

我想答案不會有任何意外

肯定是從現在開始

Right Now

為了要幫助你立刻開始行動

我想和你分享幾個對我有用觀點

首先請你放下追求完美的不確實想法

沒有人能在不做練習的情況下做出完美的表現

一萬小時法則顯示每個人要在某個特定領域成為達人

必須投入一萬小時來重複練習

所以你實作的作品有很多問題是非常正常的

接著你可能不曉得的是

在你所知的某個領域的大師

他在剛開始的時候很可能也是個大失敗者

我聽說過在美國有一位滑雪國手

在小的時候他滑雪的技巧在班上是最差的一個

透過大量的練習才讓他取得後來的成功

假如你沒聽過這個故事

那我想提另一個你可能聽過的故事

火影忍者的主角漩渦鳴人

他最為人所熟知的招式就是螺旋丸

而這著招式必須要搭配影分身來發動

但你可能不曉得鳴人在一開始最不熟悉的招式

就是分身之術

更別提影分身這種高級忍術了

而且不管你現在實作的作品再糟

只要後來你學會了再回來看這些作品

你會格外的有成就感不是嗎

所以哪怕你現在的作品再怎麼糟糕

都請你要開始去創作屬於你的作品

也有些人問過我一個很重要的問題

究竟新手該怎麼做才能夠學得更快

我所能與你分享的最好策略之一

就是持續的分享並指導別人你所學到的東西

比如説你學到了路由的一些知識

那你可以寫一篇貼文放到臉書上去

或者是去課程的私密社團裡頭去解決別人的問題

都是非常好的一種做法

如果要提升對 Laravel 架構的理解並提高自信心

規劃一個有點難度的作品

把所學實際用在自己的作品上並使其上線

成果也會立竿見影的

說到這裡我有必要提醒你有哪些是不適合分享的

這個課程的影片內容與投影片版權屬於學院

所以不適合直接分享

至於其他的都可以分享

如果你很喜歡這套課程並願意分享給其他的朋友

我也非常的感謝你並將給你實質的回饋做為鼓勵

這個單元就到這邊

你有兩個作業要完成

第一個作業

請找一個部落格.論壇或社群去建個帳號

從今天開始定期寫技術分享

可以是每週甚至是每天都行

第二個作業

你可以考慮找個前端夥伴一起搭配

組隊定題去做出一個看起來很厲害的作品

我們下個單元見,掰掰

4分
打造自己的技術知識庫

為什麼你需要技術知識庫

  • 隨時記錄自己學會的技術
  • 要用時隨時可以Recall
  • 方便展現自己的技術知識量

如何打造自己的技術知識庫

  • Evernote(筆記功能最強大)

  • HackMD(最方便的線上Markdown筆記平台)
  • Notion(All in one 筆記,功能超強大)

80分
建置 Laravel 開發環境(Win)

xampp 下載網址 https://www.apachefriends.org/download.html

Visual Studio Code 下載網址:https://code.visualstudio.com/download

Composer 下載網址:https://getcomposer.org/download/

PS:在安裝 XAMPP - PHP 8,composer 2.41 的情況下執行 composer global require laravel/installer 時會出現「找不到 composer.json」報錯訊息,再執行一次就能安裝 Laravel 安裝器;安裝 XAMPP - PHP 7.4 版本無上述問題

補充資料:

15分鐘無痛搞定 Win 環境建置 https://pandalab.org/articles/90

11分
建置Laravel開發環境(Mac)

xampp 下載網址 https://www.apachefriends.org/download.html

Visual Studio Code 下載網址:https://code.visualstudio.com/download

Composer 下載網址:https://getcomposer.org/download/

補充資料:

15分鐘無痛搞定 Win 環境建置 https://pandalab.org/articles/90

20分
Visual Studio Code 安裝設定與使用教學

參考文章

Visual Studio Code 快速入門 https://pandalab.org/articles/157

11分
用 Git 來版本控管你的專案

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我想教你如何用 Git 來版本控管你的專案

首先你該知道的是

Git 屬於分散式版本控管系統

它與之前的版本控管工具有個很大的不同

就在於它把檔案的狀態作為更新歷史記錄加以保存

好處是可以方便還原與追蹤

讓我打個比方來幫助你理解

假如你建立一個檔案來撰寫程式碼

在第一次提交時一行程式碼

又在第二次提交時寫了第二行程式碼

Git 會把這兩行分開來提交進行儲存

當你看到完整的程式碼時

實際上是由兩次的提交內容組合而成

這樣的設計是為了解決協作時

對於同一檔案的修改導致互相覆蓋

又無法紀錄修改內容等問題

那麼什麼是分散式架構呢

代表版本庫不只存在於雲端

在你的本地環境也可以有一個版本庫

就如同這張圖片所示

下面的 Computer A 和 B 是兩台本地開發電腦

而 Server Computer 則是遠端版本庫

Server Computer 可以把 Computer A 的開發內容同步到 Computer B

我知道剛才我重複了不少次版本庫

可能你還不清楚那到底是什麼

版本庫是記錄檔案或目錄狀態的地方

負責儲存內容的修改歷史記錄

分為本地端與遠端版本庫

本地端與遠端版本庫功能相同

差別在於遠端版本庫作為團隊協作分享程式碼之用

在這張圖的 Push 意味著把本地端的內容推上雲端

而反過來 Pull 則是意味著把雲端的內容拉回本地端

我知道你又聽到了一些英文的術語

正開始覺得好像很複雜

事實是我還會告訴你更多的術語

了解他們對你駕馭 Git 是至關重要的

但我會盡可能的說明清楚讓你能夠理解

接下來談談 Git 的三層式目錄結構

工作目錄 working directory

這是專案被取出的某一個版本

這些檔案從 Git 目錄內被壓縮過的資料庫中拉出來

並放在保存目前專案的目錄供使用或修改

暫存區域 staging area

位於工作目錄與版本庫之間

為向版本庫提交前的暫存區域

所有提交並不是直接進到版本庫

而是先進到暫存區作索引等確認無誤之後才提交

Git 目錄 repository 也就是版本庫目錄

用來儲存專案的 metadata 及物件資料庫

這是 Git 最重要的部份

當從其它版本庫複製時會備份過來

接著來說明一下 Git 的基本工作流程

每個檔案一開始的狀態為 untracked

中文來說就是尚未被追蹤

當這個檔案被 add 之後

檔案的狀態就會轉為 unmodified

也就是變成已追蹤的狀態

add 這個術語最好也能夠記一下

所有狀態為 tracked 的檔案一旦被修改

它的狀態就會轉為 modified

如果你想要提交這些檔案就必須把它們移到暫存資料夾

它的狀態再度轉為 staged

一旦你終於提交了這些檔案

它的狀態就會回到 unmodified

如果你不想要再追蹤這個檔案

可以對檔案進行 remove 的動作

它的狀態最終又回到了 untracked

在這個小節的最後我想向你介紹一些在輸入 Git 指令時常見的術語

Commit 也就是提交

讓你能提交修改到本地版本庫來進行儲存

Pull 能將最新提交下載到本地版本庫

反過來 Push 能夠上傳最新提交到遠端版本庫

Branch 能夠用來建立新分支

我在之後的 Git 進階技巧單元

將會詳細說明該如何使用分支

Merge 也就是合併

能將指定分支合併到當前分支

Stash 將當前修改暫存

作為不想要提交但想要儲存下來的另一種選擇

這個單元沒有作業

但我強烈建議你好好的認識一下剛才所提過的術語

你一定會用上的 我保證

問題排除

一直出現驗證失敗的問題

用 Token 取代 Git 帳密的作法

  1. 進入 Github 的個人設定 > Developer settings > Personal access tokens
  2. 點選 Generate new token 後,選擇 repository 相關的權限後,建立一個新的 token ,就能得到 token 序號
  3. 將Git網址改成以下的格式
<https://你的帳號:你的token序號@github.com/你的Git路徑>

token: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

Windows版本如何重置驗證設定

要提交時,commit鍵是反白的

Ans:

commit按鈕反白的原因是你還沒有把要提交的內容放入暫存提交庫(Stage Poll),請按一下 Stage All 按鈕即可取消反白

Sourcetree 介面問題

WINDOWS ADD跟CREATE有什麼不一樣?

為何看影片要MAC電腦要點ADD 我的是WINDOWS老師卻要我點CREATE,這兩個不太清楚

Ans:

Create 和 Add 在兩個版本有所不同。在Mac版本的 Add 可以用來把本地專案加入版本庫,但 Win 版本則必須要使用 Create 才行

找不到新增遠端數據庫的按鈕

建立遠端版本數據庫那個NEW鍵在哪裡,WINDOWS版我很常找不到老師說的鍵在哪..

Ans:

要新增遠端數據庫,在 SourceTree 的工具列,找 Repository > Repository Setting 即可找到 Add

 

7分
Git實作說明

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我將快速地告訴你一些實作中需要知道的重點

建議你可以搭配下一個單元的 Git 實作示範來學習

雖然當你在網路搜尋時多半都是透過命令列來執行版本控管

但我覺得透過使用者介面來進行管理會更為直覺

也推薦你來試試看

我自己是使用 SourceTree 來進行版本控管作業

它同時支持 Mac 和 Win 兩種版本

介面雖然略有不同但整體的用法是差不多的

投影片會是以 Mac 版本來介紹

但下一個單元的示範則是用 Win 版本

請不用擔心

請到這個網址來下載 SourceTree 客戶端

或者是在 Google 搜尋 SourceTree 也可以找到

在安裝 SourceTree 的過程中

如果你從來沒有註冊過 Bitbucket 的話

會需要你順到註冊一個 Bitbucket 帳號

當你需要 Git 的雲端版本庫時

我會推薦兩種方案

方案A 是 Github

全世界最多人使用的版本控管庫

PHP 的套件程式碼都是被存放於這裡

你可以免費的把開源項目存放於這裡

但私有專案可是要付錢的

方案B 就是 Bitbucket

它的名氣沒有 Github 那麼大

但優點在於你可以免費存放私有專案在這裡

所以我會把外包專案放在 Bitbucket

也推薦你這麼做

完成了工具的準備

現在我來說明 Git 實作中的一些細節

這是 SourceTree 的介面

這個位置讓你能夠切換要顯示本地端亦或者是遠端的版本庫

所有版本庫會被列在這裡

當點這裡的下拉選單會出現常用功能列表

Clone from Url

讓你能從遠端版本庫複製出一份本地版本庫

Add Existing Local Repository

加入已存在的本地版本庫

這個是顯示當前工作區是屬於哪一個分支

一般來說 master 就是主要分支

這個數字則是告訴你工作區裡有幾個被追蹤的檔案有變更

當你打開某一個版本庫之後

就會看到這個介面

這裡是所有提交的列表顯示

左下角是所有變更檔案的列表

而當你選擇某一個被變更的檔案時

就會在右邊看到有哪些變更內容

當你準備好要提交時按下左上方的 Commit

就會出現這樣的介面

中間會隔成兩欄

左邊是 stage 設定區域

你可以決定要把哪些變更放進 Stage 資料夾

只要把它們從下方移到上面來

透過按下這個 staged files

接著在這裡你可以輸入本次提交的訊息文字

用來說明此次提交的變更

最後按下右下角的 Commit 藍色按鈕來完成提交

你就會看到剛才的提交已經被記錄下來

最上方這一條就代表著剛才我們所做的提交

如需設定遠端版本庫時

找到在工具列上方的 Repository

選擇 Repository Settings

這就是設定遠端版本庫的介面

切換到 Remotes 頁籤之後按下 Add 按鈕

就可以開始設定遠端版本庫了

把遠端版本庫的網址貼在 URL/ path

Remote name 只是用來顯示這是哪一個雲端

可以隨意取名用以區別

至於下方區域通常會根據 URL 而自行判定

不需要自己輸入的

完成後按下 OK

就完成了遠端版本庫的設定囉

當你想要把本地端的版本庫上傳到雲端

可以透過 Push 按鈕來上傳提交紀錄

這個介面的使用方式也很簡單

在這裡先選擇你要上傳到哪一個雲端平台

接著選擇所要上傳的分支

像這裡是選擇主要分支

按下 OK 鍵之後就可以進行上傳了

回到列表清單之後當你看到像這樣的顯示

斜線左邊為上傳的雲端平台名稱

斜線右邊為上傳的分支

就代表順利完成上傳了

接著說明該怎麼用 Clone 來複製版本庫

選擇 Clone from URL

這個操作會把修改歷史都完整複製下來

與原先的本地版本庫相同並可執行同樣操作

在這個介面的 Source URL 貼上遠端版本庫網址

如果網址無誤的話

下方會出現 This is a Git Repository

Destination Path 設定要把此專案複製到哪一個資料夾

Name 設定此版本庫的名稱

按下 Clone 鍵之後就可以進行複製了

接著說明怎麼用 Pull 功能來下載提交紀錄

使用 Pull 之前請記得得先要把暫存區的修改先提交才行喔

按下 Pull 鍵之後會出現這個介面

選擇要從哪一個雲端平台進行 Pull 以及指定分支之後

一般不需要改動任何設定就可以按 OK 來進行下載了

這個單元就到這裡

你的作業就是先下載 SourceTree

並註冊 Github 和 Bitbucket帳號

那我們下個單元來實地的進行示範吧

7分
Git實作示範
問題排除: 如果您的電腦環境是 Windows,而在建置過程中出現找不到路由的狀況,建議參考 "windows開發環境建置"單元,10分53秒的 httpd-vhosts.conf 來調整,重啟 XAMPP,或許能解決您的問題
40分
Git進階知識

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元來討論一些你或許會想要知道的 Git 知識點

首先就從 Branch 分支談起吧

Branch 能讓你同時發佈多個版本

比如藍色的上線分支是一個版本

再如綠色的追加功能分支又是另一個版本

這多個版本都屬於同一個專案

那各分支之間的關係是什麼呢

你可以把分支想像成各自不同的流水線

其中有主流也有支流

比如這裡的 master 是主流

在 C1 點分支出新的 develop 分支

接著又在 develop 分支的 C5 點上

再度分支出 bug fix 分支

分支可說是 Git 最強大的功能之一

而且分支還可以再合併到其他分支的

我們來看這個例子

當影片上線之後發現影片有點問題

我們可以切出綠色分支來處理這個問題

等到這個分支測試無誤之後再合併回到主支

那上線版本的影片問題就解決了

同樣的道理

添加新功能以及顯示廣告等功能都是相同的概念

可建立新的分支來單獨的進行特定功能開發

完成之後再合併回上線版本

下一個來聊聊 Checkout

這是用來切換分支或者是提交的

這在使用 SourceTree 的過程中你不會有感覺

只要在分支之間雙擊一下就可以完成切換

而這個動作就是指令中的 Checkout

比如這個例子中從紅色分支切換到綠色分支後

工作目錄的狀態就會變更為新分支的狀態

另外要特別注意的是

Checkout 之後的提交修改同樣會屬於切換後的分支

Head 標頭

你應該知道每個分支都是由多個提交組合而成

標頭就像是唱片的磁頭一樣

預設它會指向最新的提交

這種狀況下 Head 不會出現

當切換到先前的提交時,標頭就會指向到該提交

為你指名工作目錄位於該分支的哪一個提交版本

所以出現 HEAD 標籤

這就意味著當前工作目錄不是最新提交狀態

接著來看看合併分支怎麼做吧

當分支已經開發完成並經過測試後

就可以進行合併了

作法就是切換到所要合併的目標分支後

再選擇被合併的分支去進行 Merge

對著某個提交按右鍵就會出現 merge 的選項

我知道你可能搞不清楚誰合併誰

請記得這個口訣

大魚吃小魚

主支是大魚而分支就是小魚

所以合併時就該是切換到主支來合併分支喔

Stash 儲藏

這是用來將當前修改暫存起來

算是不想要把修改直接提交的另一種臨時儲存機制

有一點像是課桌的抽屜功能

東西沒有完成不可以歸檔就先放到抽屜等有空再來處理

修改一但被儲存之後預設是會被清除的

不過你之後可隨時取回

所以不用擔心會消失

用法就是點上方的 Stash 按鈕

接著給它一個名稱用以識別即可

之後如果需要取回這份改動

只要在 Stash 區域找到它按右鍵選擇 Apply 就能夠取回改動了

接下來我就實際示範給大家看看

接著我來說明一些比較常見的 Git 問題該怎麼處理

有時候當你準備上傳提交到遠端版本庫

沒想到有遠端版本庫有了一個新的未下載提交

很可能是因為有其他組員上傳了新的版本

因此這次的上傳將被遠端庫拒絕

最終導致 Push 失敗了

像這個例子中雲端多出了一個 A2 版本是本地端所沒有的

這就導致上傳必然會失敗

因為雲端平台不會曉得這兩個提交該如何整合

需要由你在本地端自己判定

要解決這個問題的步驟是

第一步先執行 Pull

把最新的提交給下載到你的本地端

第二步要執行合併

SourceTree 會發現本地庫有新修改

會嘗試自動幫你合併在一起也就是 Merge

如果有修改到相同的檔案就會需要你手動修改

當解決衝突之後就可以再嘗試進行合併以及 Push

你可能想問什麼是衝突又該如何解決呢

當有同樣的檔案被修改導致 Git 不曉得該採用哪一個

這就稱為衝突

所謂的衝突處理

也就是讓提交人自己決定應該如何合併該檔案的修改

發生衝突的程式碼會出現以多個等號為分隔線

並以箭頭為界的區塊,用以標示各提交的修改內容

Git 判斷衝突是否被解決的邏輯也很簡單

只要這些符號被移除就視為衝突被解決

因此當你完成程式碼的修改之後別忘了要移除這些符號

像是這樣把符號給移除之後衝突就算被解決啦

接下來我也實際示範給大家看看

Git 的內容相當的多

因此最後我來為大家做個重點總結

什麼是分散式版本控管呢

就是把檔案狀態作為更新歷史紀錄來保存

方便之後的還原與追蹤

而版本庫可分成本機端與遠端

用以提升控管效率並更容易與團隊去協作

那麼你又該如何開始對專案進行版本控管呢

假如你還不熟悉 Git 的話

我很推薦你透過 SourceTree 來視覺化進行版本控管

你可以在 Github 建立你的公開專案

而在 Bitbucket 去建立你的私有專案

每一個上線專案請至少準備兩個分支

master 作為上線版本

以及 dev 作為開發版本

如果你偏好在 VScode 裡頭搞定一切

也可搭配 VsCode 的 Git 介面來提升作業效率

這個單元就到這裡囉 掰掰

7分
Bitbucket App Password 申請
3分
HTTP 簡介
8分
HTTP 動詞
6分
HTTP 標頭
4分
HTTP 標頭檢視示範
1分
HTTP 狀態碼
11分
DNS 概述
4分
常見的 TCP 阜口介紹
3分
什麼是 API?
7分
REST 與 RESTful
6分
該如何學習 Laravel?
10分
PHP 套件管理 - Composer介紹
8分
何謂語意化版本
5分
MVC 架構設計
6分
Laravel 專案說明
6分
13分
路由基礎概念與語法

你好 歡迎回到 Laravel 百萬年薪特訓營

這個單元來聊聊路由基礎概念與語法

[換頁]

這個單元的內容較多

就讓我們先從初探開始聊起吧

[換頁]

還記得之前在 MVC架構 的單元看過這張圖片嗎

那時有提過 Router 是在 Web 容器內第一個負責接手的單元

負責根據路由規則來指派給對應的控制器方法

[換頁]

就像你今天前往台北 101 去拜訪 Google 辦公室

在上電梯之前需要先到一樓的櫃檯去換證件做登記

你的拜訪是一次請求

而幫你辦理登記的櫃檯就是路由

今天我們就更近一步的來說說裡頭的細節以及語法

[換頁]

這裡稍微帶一下

其實在 Laravel 5.3 以前的版本

路由並沒有自己的資料夾

只是單純的一個檔案名為 routes.php

所有的路由規則都被寫在這裡頭

直到新的版本才區別出來把不同類別的路由分在各自的檔案中

[換頁]

首先我們看到 api.php

這個檔案負責定義 API 請求路由的工作

比如看這個程式碼

加上名為 auth:api 的中介層

代表要請求前要先進行 API 所需的驗證

[換頁]

下一個來看 web.php

它負責定義網頁請求路由的工作

也就是初學者最常寫路由的地方

語法格式像這樣

先寫 Route Facade

所謂 Facade 指的是 Laravel 所提供的工具類別

包含大量好用的類別函式

Laravel 有大量的 Facade 來幫助你快速開發

你會在課程單元中逐一的認識他們

後面接請求方法或稱Route動詞,比如 get

參數列的第一參數為偵聽的 URI 路徑

第二參數則說明負責接手的控制器與其方法

如果控制器類別位於 Controllers 資料夾內的子資料夾

可透過點語法來指定

路由規則在制訂時最好不要模擬兩可

也就是多個都符合都狀況

但是當有衝突時

規則判定是由上至下逐一比對

只要符合路徑就傳遞給控制器

意味著上方路由的優先級較高

如果你是從 Laravel 8 以前的版本開始入門

應該會發現到現在控制器類別名前需要補上命名空間

這是因為從 8.0 起,預設控制器前綴改為null

要特別注意一下這部分

[換頁]

同樣也是在 8.0 開始,路由規則支持標準PHP可呼叫式語法

函式的第二個參數改成傳入陣列結構

陣列內分別是控制器與方法名稱

若使用這種語法別忘了要用 use 保留字來指定控制器的命名空間

[換頁]

接著來看 Route 動詞

這目的是設定該路由規則所支持的請求方式

其中最常用的當屬 HTTP 原生的 GET 和 POST

至於其他的像是 PUT . DELETE 等等

使用上和 POST 比較接近

ANY 和 MATCH 有些特別值得拿出來聊聊

ANY 代表支持所有 Route 動詞

是最為開放的一種 Route 動詞

使用上請務必慎重

至於 MATCH 是指定該規則能支持多種 Route 動詞

透過條列式方式來詳列

就如同畫面上的程式碼設定為 GET 與 POST

[換頁]

接著聊聊 Closure 這個術語

這就是其他程式語言也有的匿名函式的意思

在 PHP 入門單元我們有提過

當函式不需要被呼叫時就沒必要為之取名

而沒有名字的函式就是匿名函式

你在當時或許會想如果函式不需要被呼叫那要做什麼用

這段程式碼就是一個使用 Closure 的時機

在剛才的路由規則語法有介紹過

第二參數的部分需要指定負責接手的控制器名稱與方法

但如果你想要事情直接在路由處理掉

就可以將第二參數替換成匿名函式

用它來封裝所要執行的程式碼並且傳入函式中

也就是說匿名函式可當成物件.指派給變數當成參數傳遞

這段程式碼註冊了一段路由規則

當有人訪問專案跟路徑並以 GET 或 POST 請求動詞

就會顯示 Hello World 在畫面上

[換頁]

寫過 PHP 原生程式開發的朋友

應該對 echo 這個函式並不陌生

它可以讓我們顯示一段文字在網頁上面

那在 Laravel 框架要回傳一段純文字

可否也使用 echo 呢

答案是否定的 你幾乎沒有任何時機需要再使用 echo

理由是這些文字並非直接回傳給前端

中間還是會經過回應堆疊和中介層等等

這裡頭就有包含 echo 所做的工作

至於什麼是回應堆疊什麼又是中介層

後續再找單元好好來談

現在你只需知道它們負責網頁內容轉換與安全等工作

[換頁]

接下來我們要討論的是 Route 是如何傳遞參數的

畢竟如果沒有傳遞參數的機制

伺服器就不知道客戶端所需要的資料到底是什麼

Route 透過直接把參數作為網址路徑的一部分來傳遞

故而稱為 Route 路徑參數

[換頁]

來看看這兩段程式語法

第一條路徑規則在路徑第二段的部分用上了大括號

這說明了 id 並非真正的路徑而是路徑參數

之後網址的這一段將做為參數傳給接手的控制器方法

所以匿名函式可得到一個同名的參數

因此當客戶端訪問的路徑為 user/1

那麼變數 id 的值將為 1

而且你該知道的是路由規則不只可接受一個路徑參數

像第二條路徑規則就示範包含兩個路徑參數

第一個是 post 而第二個是 comment

同樣的在函式也會得到對應的同名參數

要特別注意的是參數的順序必須要保持一致才行

因為它們的對應實際上是根據順序而非參數名稱

另外有個小細節是資源名稱 posts 一般來說會用複數型

表示每個表格有多筆資料

這寫法比較接近 RESTful 的寫法

供你一起做個參考

[換頁]

聽到這裡你可能有個問題

假使路徑規則包含參數的話是否一定就要提供呢

是也不是

以剛才的語法來說確實必須要提供參數才是合法的

但如果你的需求是可提供或者是不提供

可以在路徑參數後加上一個問號來表示非必須

像這一個範例中的 id 後面加上了問號

導致函式在取得 id 參數後有可能得不到資料

因此我們有必要在參數列作設定預設值的動作

這段程式碼會在 id 路徑參數不存在時將 id 參數設為 1

反之如果參數存在則取用傳入的參數值而非預設值 1

[換頁]

下面來聊聊 Route 群組

這在簡化路由宣告程式碼時非常的有用

將多個路由群組化,可一次對這些路由進行設定

請你務必試著使用看看

[換頁]

設定路由群組的方式就像是這樣的結構

一開始使用 Route 保留字

後面接靜態函式 group

參數是 Closure 匿名函式

用來封裝所有要納入此群組的路由規則

像這個例子將 hello 與 world 兩個路由規則納入群組中

在群組之前會先宣告要加入此群組的設定

接著我就來介紹一些好用的設定

[換頁]

第一個是 prefix 路徑前置詞

目的是為規則的路徑再多加一段前路徑

用例子來說會更好理解

在這段程式碼中的設定區加上 prefix 為 users

因此群組內的路由原本路徑為根路徑

但實際上要訪問這個路徑的新路徑變成了 /users

這在處理某一資源的所有路由時很好用

省去每個路徑都要加上資源名的困擾

[換頁]

第二個是 namespace 命名空間

一開始有說過 8.0 開始你要明確指定控制器類別的命名空間

這變得有點辛苦尤其是路由規則很多的情況之下

除了複製貼上大法之外另一個救贖就是透過命名空間設定

透過在群組前面加上 namespace 函式

傳入命名空間作為參數後

群組裡頭的路由規則就不需要再逐一指定命名空間囉

在這段程式碼中因為已經宣告群組的命名空間了

所以群組內的命名空間都是它

[換頁]

第三個是 middleware 中介層

當我們希望將為某些請求加入一些新作業流程

比如回應前先驗證該用戶的身份

這時中介層就派上用場了

要為群組內的所有路由都加上中介層

透過在群組前面加上 middleware 函式

傳入包含中介層名稱的陣列作為參數後

就完成了路由規則加入中介層的宣告

在這段程式碼中就為群組裡頭的所有路由加上 auth 中介層

這個中介層是 Laravel 內建的中介層

所有加入 auth 中介層的路由規則都需要完成登入後才可訪問

很適合用於保護一些較為隱私的路由

群組的話題就先談到這裡

[換頁]

接下來聊一下 Route Model Binding

有些入門者不太了解這是做什麼用的

也不知道什麼是 Binding

實際上這是個會用最好

可以幫你省下一行程式碼

但不會也不影響的技巧

所謂 Binding 指的是把參數和資料庫的某筆資料自動綁定在一起

因此 Route Model Binding

就是把路徑傳入的參數直接和資料庫的對應資料自動綁定的技術

使用上說難不難

只要將路徑參數取名為模型類別名稱

在參數前宣告該模型的類別

並且參數名稱取和類別名稱相同

完成這三個步驟

Laravel 就會自動為你用 id 進資料庫查詢該表

找到之後直接提供模型物件給你

最終你所得到了路徑參數不只是主鍵 id

而是該 id 所對應的表格資料了

還是不太懂是嗎

來看這個例子好了

路徑的第三段是路徑參數

因此伺服器訪問了 api/users/1

也就是說路徑參數 user 為 1

一般來說你的程式碼將得到 1 作為參數

但實際上你需要的是用戶 1 的完整資料

比如名稱或帳號等等

所以你需要自己再去查詢 id 為 1 的用戶資料

但透過完成 Route Model Binding 的三個步驟

可看到程式碼就直接取用 email 欄位而不需進行查詢

那三個步驟就是

因為用戶表格的模型類別為 User

步驟1 路徑參數取名為 user

步驟2 函式參數前宣告模型類別

步驟3 傳入參數同樣取名為 user

這樣魔術就完成了

[換頁]

這個單元比較多

最後我來幫大家做個課後總結

[換頁]

什麼是 Route 路由呢

我們定義出請求動詞與路徑的組合

用以判斷請求要交由哪個控制器方法來接手

什麼是 Closure 呢

意指沒有名稱的匿名函式

該函式不需被呼叫一般用於封包程式碼

什麼又是 Facade 呢

泛指 Laravel 所提供的工具類別們

有著大量好用的類別函式

最後什麼是 Middleware 呢

指的是中介層

只要有導入它的請求在處理前會先執行該中介層的內容

[換頁]

如果你覺得這個單元的內容有點多

讓你感覺有點快要窒息的感覺

沒關係的

你只要先理解這些重點知識即可

第一 能夠撰寫基本的路由語法

第二 會用 GET 和 POST 這兩種請求動詞

第三 會用路由傳遞參數

第四 會宣告群組

這個單元的所有程式碼示範都放在另一隻示範影片內

如果還沒看過的話記得回去看看喔

這個單元就到這邊 掰掰

 

需要優先掌握的基本語法

  • 會撰寫基本路由語法
  • 至少會GET.POST兩種動詞
  • 會用路由傳遞參數
  • 懂得怎麼轉址
15分
網址生成與轉址語法

你好 歡迎回到 Laravel 百萬年薪特訓營

這個單元來聊聊網址生成以及轉址相關的常用語法

剛在入門的朋友當需要超連結的時候往往會有困擾

該如何取得某個路由的網址

這個問題將在這個單元予以解答

同時把相關轉址話題一起說明

[ 換頁]

首先來聊如果要生成網址有哪些具體作法

[換頁]

幫助函式 url() 可用於應用當中的所有 URL

而這些 Laravel 所為你生成的 URL

都將自動使用當前請求中的 HTTP 協定和網域

[換頁]

第一個工具是 url 函式

功能是根據所傳入的路徑參數來生成完整的 URL 網址

比如傳入 welcome 參數後

將生成帶 welcome 路徑的完整網址

這是最為常用的一個工具

第二個工具是 action 函式

功能是根據指定的控制器與方法來生成完整的 URL 網址

比如傳入一個陣列裡頭包含控制器與方法的名稱

將生成由該控制器方法負責接手的路由網址

比如這一個例子中生成專案的根路徑

入門者在使用這個工具會有個迷思

以為不需要撰寫路由規則直接透過這個工具來生成網址

事實是這個工具仍舊會按照路由規則來反推網址

所以該有的路由規則還是要設定的唷

第三個工具是 route 函式

功能是搭配路由名稱來生成該路由的 URL 網址

這個工具必須是在所要生成網址的對應路由有取名才能使用

比如這個例子中傳入 posts.show 為路由名稱

意味著有某個路由已被取名為 posts.show 才能運作

所生成的網址就是取這個名稱路由的完整網址

如果該路由有路徑參數也不用擔心

可以透過第二參數的資料陣列來傳入

例子裡頭的第二參數就傳入路徑參數 id 的值為 1

假如路徑參數不存在 id 呢

不用擔心

那這個 id 參數將轉為查詢字串來呈現於網址後方

[換頁]

至於該如何去幫路由規則命名呢

你可以在路由宣告的最後再呼叫 name 函式來取名

參數只有一個就是所取的名稱

名稱慣例一般為資源名稱.動作

像這個例子的 users 就是資源名稱

而 index 則是動作代表要檢視所有資料

[換頁]

那如果想生成當前頁面的網址呢

這裡我會示範的是透過 url 函式來取得

但實際上你也可以把 url 函式改為 URL Facade

當你需要的是當前網址不帶查詢字串

可以在 url 函式後面接 current 函式

而當你需要的是當前網址帶查詢字串的版本

則可以在 url 函式後面接 full 函式

而當需要的是上一頁網址帶查詢字串呢

沒問題

可以在 url 函式後面接 previous 函式

[換頁]

下一節來聊聊如何轉址到其他頁面

[換頁]

最簡單的轉址作法就是在控制器方法裡頭

回傳 redirect 函式

此函式的第一個參數就是所要前往的網址

建議提供完整網址

所以你可以搭配上一節所介紹的網址生成工具

如果不是太講究的話

redirect 函式不管是外部或內部網址都適用

但講究的來說 Laravel 有針對外部網址

提供額外的轉址工具

畢竟外部網址不需要進行中介層的處理

官方文件有完整說明我這裡就不說太多

[換頁]

如果你想要建立專門用於轉址的路由規則也是做得到的

同樣使用 Route Facade

呼叫 redirect 函式

第一個參數是路由的路徑

第二個參數是要轉到哪個新網址

第三個參數是回應狀態碼

在這個例子中當使用者訪問 goblinlab 路徑

就會被轉到新的哥布林學院官網

並回應狀態碼 301

[換頁]

此外還有一種比較特殊的轉址情境

當訪客填寫表單後提交

伺服器發現訪客所填內容有問題時會想轉回表單頁

但是如果轉回時所有欄位都清空的話

訪客就必須重頭填起是非常惱人的互動體驗

比較好的做法是把原先填過的內容一併傳回

要完成這個魔術的技巧非常簡單

只要在 redirect 函式的後面

追加呼叫 withInput 函式就可以囉

[換頁]

接著前端也要配合調整才能得到這些回傳的資料

在視圖檔案上透過 old 函式即可

第一參數為資料名稱

比如這個例子中取得 username 欄位的資料

第二參數為預設值

當找不到該欄位資料時使用預設值

如果不提供的話就是空值

這個單元就到這裏

我們下個單元再見 掰掰

6分
【 API 開發 】Controller 生成與撰寫示範
11分
【 API 開發 】用 Controller 來管理流程
12分
【 API 開發 】用請求(Request)來取得用戶資料
13分
【 API 開發 】用回應(Response)來傳送網站資料
9分
【 API 開發 】VSCode的 API 測試工具 - Thunder Client 安裝與介紹
5分
【 API 開發 】最多人用的 API 測試工具 - Postman 安裝與介紹
4分
【 API 開發 】寫出自己的第一個API:Hello,你是誰
7分
【作業】API設計練習
mb
7分
用套版來快速製作網頁前台
16分
用付費套版來製作精美網頁前台
12分
資料庫系統(Database)入門

你好 歡迎回到 Laravel 百萬年薪特訓營

這個單元我想要用一點時間讓你對資料庫系統有個基本的了解

[換頁]

資料庫是以電腦化來儲存資料的系統

好處是使用者可透過各種應用或程式

以 SQL 語法來存取想要的資料

比如取得住在台北的客戶名單

你也能理解資料庫為儲存資料的容器

不過實際上這些資料是以檔案的形式而存在

你不需要親自去管理這些檔案

它們都是經由資料庫管理系統 DBMS 來存取的

免費的有 MySQL

付費的像是 MSSQL . ORACLE 等等

需要從資料庫存取資料的應用程式

就是我們的 Laravel 專案

[換頁]

下面我們要說明的是

為什麼現在全世界所有的資料都是透過資料庫來進行儲存

而不再是透過A4紙和公文夾

第一點顯而易見的

資料庫能夠減少人事行政以及存放空間的浪費

你甚至能夠用一個小小的隨身碟存下一座圖書館的書籍內容

第二點對應用程式來說格外重要

當你的應用需要呈現所有住在台北的客戶時

在沒有 SQL 之前那需要人們花費多少時間來進行整理與收集

但在 SQL 誕生之後,瞬間就能夠得出所有住在台北的客戶名單

因此 SQL 語法就是所有後端工程師必備的入門知識

第三點將所有資料集中到資料庫來進行管

你就能夠納入權限控管

比方說某些角色比如行政只能夠讀取資料而不能刪除

就可以避免工讀生誤刪資料的狀況發生

第四點是可減少重複資料

透過紙本方式來儲存資料要找出重複資料是困難的

所以你的書櫃或文件夾中總是免不了會有重複資料

但透過資料庫可輕易找出重複內容的功能

就可以減少重複的情況產生

[換頁]

接下來我用這張圖來幫助你了解這些術語間的關係

每家公司通常都會有人事.產品以及進銷存等資料儲存需求

因此就有了這三個資料庫

資料庫管理員要存取這些資料庫時

就可以透過資料庫管理系統來達成

至於一般網頁用戶沒有權限進入資料庫管理系統

而是透過我們所開發的 Laravel 專案來存取資料庫管理系統

這些架構合稱為資料庫系統

[換頁]

下面我將為大家介紹一些資料庫管理系統常見的類型

第一種是階層式資料庫

如同字面所說是以階層的方式來儲存資料

比如 Laravel 是第一階的話

Eloquent 和 套件為第二階

Eloquent 又衍生出 Migration 和 Seeder 為第三階

依此類推

[換頁]

第二種是網狀式資料庫

它算是階層式資料庫的複雜版本

同樣是一階一階的向下展開

但子階層還可以向上關聯到別的上階資料

比如 Seeder 作為 Eloquent 的第三階節點

又可指向到測試社群的另一個第二階節點

[換頁]

如果前兩種你不是太明白,沒什麼關係

因為這兩種比較少見

不過第三種可就要多留心了解一下

現在多數的資料庫管理系統都是這一種居多

那就是關聯式資料庫

所有資料都是以表格和欄位的方式來進行儲存

除此之外表格和表格之間還可以有關聯性

透過主鍵和外鍵關係來達成

比如畫面上的這個例子

orders 表格儲存訂單資料

訂單是需要紀錄購買者是誰的

除了要記錄購買者的姓名之外

經常也會用到年紀性別等的資料

如果把這些內容也一股腦地存到訂單表格

就會導致訂單表格變得異常肥大

而且如果某用戶下了兩個訂單

就會導致重複資料的發生

因此把用戶資料獨立到一個新的表格 users

這個動作就稱為資料表的正規化

金額為 2800 的這一筆訂單

有個欄位名為 user_id 用來記錄購買者是誰

存放的並非購買者名稱而是他的主鍵 id

我們稱這個欄位為外鍵

具體購買者的資料就要回到 users 表格

找到 id 為 1 的資料得到購買者為 Jane

連同他相關的資料都能夠查詢得到

而 users 表格的 id 欄位我們就稱為主鍵

Laravel 會希望你以流水號而非字串或複合主鍵來進行儲存

所謂流水號指的是第一筆 id 欄位的值為1

第二筆 id 欄位的值自動生成就是 2

不斷的累加所以稱為流水號

簡單的說主鍵就是這筆資料的身分證字號

Laravel 應用的查詢經常會用到 id 這個欄位

所以你應盡量確保每個表格都有名為 id 的主鍵欄位

[換頁]

單元的最後我也想解釋ㄧ下到底什麼是分離架構設計

你在看網際網路的特性時偶而會看到這個詞

它所代表的意思就像畫面這張圖

Internet 串起了世界上所有的電腦以及資料庫

所有的資料被分散的儲存在這些資料庫裡頭

但只要有網路以及足夠的權限

用戶端都能夠進到這些資料庫來存取內容

甚至搭配 API 還能讓不同的系統之間進行溝通

透過分離設計讓系統變得更為彈性

這個單元就到這邊

如果關於資料庫系統還有任何問題

歡迎你到問與答來提出或在私密社團進行討論

我們下個單元見 掰

----------------------------

參考資料 http://spaces.isu.edu.tw/upload/19225/0/news/postfile_174.pdf

8分
用 phpMyAdmin 管理資料庫
mb
【 MySQL 】資料表欄位常見資料型態介紹
mb
【 MySQL 】SQL的名詞說明

你好 歡迎回到 Laravel 百萬年薪特訓營

這個單元我想和你聊聊 SQL 語法的一些常見名詞

[換頁]

在開始之前我有必要先讓你知道

在我之後教你如何去做資料庫查詢時

是完全不需要寫 SQL 語法的

我會教你用更直覺的方式來進行資料庫存取

之所以教你這些知識

一來是讓你知道 Laravel 究竟為你做了什麼

方便你在之後的觀念理解上更加深刻

二來在面試時很可能會被問到

所以還是建議你有個概念比較好

還是老話一句

語法不用背,看得懂會用即可

那就讓我們開始吧

SQL 的全稱是 Structured Query Language

中文的意思就是結構化的查詢語言

它也算是一種程式語言

主要是用來和資料庫溝通進行存取

易言之它能用來查詢、更新和管理關係資料庫系統

它支援的資料庫非常多

基本上所有主流資料庫都有支持

各資料庫的 SQL 語法相似度有到九成以上

但可能還是有小小的差異

所以如果你將來用的資料庫不是 MySQL的話

還是要注意一下可能有相容問題喔

[換頁]

接下來就來聊聊資料庫裡的一些保留字吧

[換頁]

先從資料定義 Data Definition 開始

CREATE 創造

能夠用來建立資料庫的物件

這裡所說的物件包含了表格.檢視表.索引以及許多更進階的東西

在 Laravel 百萬年薪特訓營的課程中我們只會關注表格 Table

其他一般來說會在你成為資深工程師之後才會碰到

有一些比較大的公司甚至會有專門的資料庫工程師來處理這些進階物件

Alter 變更

能夠用來變更資料庫的物件,比如某個表格的結構

Drop 刪除

能夠用來刪除資料庫的物件,比如協助你刪除某個表格

[換頁]

下一個來看的是資料操縱 Data Manipulation

這些名詞多半與處理表格內的資料有關

Insert 新增

能夠用來新增表格的資料

Update 變更

能夠用來變更表格的資料

Delete 刪除

能夠用來刪除表格的資料

這幾個是網頁工程師最常用的幾個動作

雖然不難但還是要請你特別留心一下

[換頁]

這一節的最後來看的是資料查詢 Queries

SELECT 能用來查詢資料庫的資料

比如查詢會員的資料並顯示在網頁上就會用到它

這可是你必須要會的技巧

請你多看它幾眼,不要輕易忘了它

[換頁]

下一節我來為你介紹一些表格欄位

[換頁]

SQL的資料型別大概可分為數字.字串.空值.布林值以及時間資料

數字資料包含整數與小數,正負數也都算

字串資料就跟 PHP 語法所教的一樣,很簡單

空值用的是 NULL,表示該欄位沒有資料

布林值用的也是 true 和 false,以小寫表示

日期也都和 PHP 差不多,沒有需要特別注意的

[換頁]

因為很多人搞錯所以我覺得有必要提醒你

空值和空字串是不同的概念

以生活的例子來比喻

當你和親愛的女朋友說話時

空值代表你無話可說,某些情況下會讓自己很被動

而空字串則是你說了什麼,卻又像什麼都沒說

但至少你給了對方回應而不是沈默

所以當資料的某個欄位被寫入了一個空字串

那這個欄位就不是空值了,請特別注意

當寫入資料時,如果某個欄位設定為 AUTO_INCREMENT

那就算你寫入該欄位的資料為 NULL

他也會幫你根據目前的計數值加一後寫入

最常見的就是主鍵欄位

Laravel 主鍵欄位為 id 傾向使用的就是流水號

下一個如果 NULL 是插入到時間戳記欄位 timestamp

則代表的是當前時間

下一個談到的是索引

如果你不了解什麼是索引

它就像是圖書館的書號系統用來幫助你更快速的找到資料來提升查詢效能

如果某個欄位用來進行索引的話

該欄位是不可以有空值的

所以記得要宣告該被索引欄位為 NOT NULL 也就是非空欄位

當然你也不應該寫入空值到這樣的欄位裡頭

[換頁]

假如你不曉得為何要這麼做,請看看這個例子

訂單表格有需要紀錄該訂單是哪個用戶下的

為了將用戶資料做更好的管理就會作正規化

也就是將用戶資料獨立成一個單獨的表格

也就是這裡的使用者表格

上面的例子中 NS 的購買者 id 為 1

透過使用者表格就能對應得出購買者為張三

但是下面例子 PS4 的購買者 id 為 NULL

這情況下就無法對應出購買者是誰因而產生程式錯誤

這樣你知道為何索引欄位不應該是空值了吧

[換頁]

最後一節來聊聊 SQL 的一些名詞

[換頁]

資料表對我們來說可說是資料庫最重要的物件

每個資料庫都是由一個以上的資料表所構成

而資料表名稱必須是唯一的,有區分大小寫

Laravel 會建議你用小寫,且用複數

比如使用者表格用的就是 users

表格名稱如需用到兩個單字,建議採用蛇底式命名法,而且字母較小者排前

所謂較小指的是在 26 個字母中排序較前

比如訂單與商品的中介表格用的就是 item_order

資料表中每一直行 column 稱之為欄位

而每個欄位都需要指定其資料型態 data type

至於由不同欄位所組成的橫列 row,稱之為記錄 record

白話說就是我們常說的資料了

[換頁]

我用這個例子來幫助你理解剛才所說的名詞

這個表格的名稱為 users

儲存用戶資料用的是複數型,符合 Laravel 的命名規範

共有 id 等六個 Column 也就是欄位

裡頭包含了張一 等四筆資料 也就是紀錄

[換頁]

接著說說 SQL 敘述句 Statements

它是用來和資料庫溝通,讓你下達指令的

SQL 語言是由命令 commands 子句 clauses

搭配 運算子 operators 及 函數 functions 所組合而成

通常 SQL 敘述句由一段命令句開始描述要對資料庫要求的動作

接著可能會接著條件語句

並在最後以分號來結束命令

SQL 語句是不區分大小寫的

英文是 case-insensitive 請特別注意

[換頁]

這是 SQL 敘述句的一個例子 供你作為參考

這兩行都是用來查詢 users 表格的所有資料

我們會有專門的單元來介紹它們

這裡就不說太多 看不懂也不需要擔心喔

[換頁]

接著的是命令 Commands 它代表所要執行的資料庫動作

比如建立新的資料庫.資料表.欄位以及索引等

又或進行資料的查詢、修改、新增及刪除等動作

包含有 CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE 等

[換頁]

接著的是子句 Clauses

子句能用來操作你的 SQL 查詢

我們來看幾個常見的子句

FROM 用來指定你所要操縱的表格

WHERE 用來過濾你所要查詢的資料範圍

GROUP BY 用來設定分組條件

ORDER BY 用來設定資料輸出後的排序方式

[換頁]

算術運算子 是我們的老朋友了

在 PHP 入門語言應該都看過它們了

用法完全相同

% 的用途是取餘數,比如 7 % 2 的結果是 1

[換頁]

邏輯運算子也沒什麼特別好介紹的

[換頁]

比較運算子和 PHP 語法同樣有 87 趴像

但是不相等用的是小於大於和 PHP 用驚嘆號不同

需要稍微注意一下

[換頁]

SQL 有多了一些比較運算子也介紹給你認識

BETWEEN 能用來讓你指定某欄位的資料須介於某範圍之內

比如這個例子中用來取出年紀介於 18 歲到 40 歲之間

LIKE 能用來做模糊搜尋

比如這個例子中用來取出地址資料是以中山路開頭

IN 能取出資料的值符合集合內容的

比如這個例子中能用來取出所有張一與王二的訂單

[換頁]

單元的最後來看一下 SQL 的函式

它提供了很多方便的資料計算函式,這裡只是列舉一些比較常用的

事實上還有非常多

比如 AVG 用來取平均

COUNT 用來算數量

MIN 和 MAX 一個是最小一個是最大

你需要時再到 Google 去查詢即可

這個單元就到這邊 掰掰

13分
【 MySQL 】用 Select 結合 Where 來讀取資料

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我們來聊聊 SQL 最基礎的語法 那就是 SELECT

[換頁]

先給大家看個正妹照準備下心情

[換頁]

SELECT 主要用於指定要取得的資料欄位

結合 FROM 來指定要查詢的表格名稱

還可以搭配 WHERE 來加入過濾條件

以這個例子來舉例說明

這段 SQL 能從 users 表格取出 City 欄位為台北市的所有資料

其中的星符號 * 表示要取出該表格的所有欄位

是不是很簡單 接著來提高一點點難度

[換頁]

這段 SQL 從 users 表格取出 City 欄位為台北市

且 AGE 為 30 歲以上的所有資料

但有別於剛才的星符號 這次在 SELECT 後面有加入兩個欄位

意味著只取 Name 和 Phone 欄位而非全部

[換頁]

接著我再來多介紹一點點東西

orderBy 能夠用來將所查詢到的資料依據指定欄位來進行排序

共有正向與反向兩種排序方式

Asc 為從小到大排序

Desc 則是反過來從大到小排序

如果怕搞混的話 這裡提供一種簡單的記憶方式

Asc 為 A 開頭所以是從小到大

而Desc 為 D 開頭所以相反

介紹完 orderBy 我們來看看這個例子

從 users 表格取出 City 欄位為台北市的所有資料

接著以 Age 欄位來進行反向排序,從大排到小

[換頁]

我要繼續來幫你伸展大腦的肌肉囉 希望你還跟著上

接著來介紹 LIKE

LIKE 是非常有用的一個技巧

它能用來做模糊比對

也就是資料以某個字串開頭

又或者是某個字串結尾的都算

一般來說都會搭配 % 來使用

像這個例子寫的是台北市%

就意味著資料只要是台北市開頭的都算

不管是中山路或忠孝路都行

從另一個角度來說把 %放在前面

比如 %中山路

這就代表資料只要是中山路結尾即可

不管是台北還是高雄的中山路都行

當然你也可以在前面和後面都加上 %

那就變成只要資料包含某段文字即可

不論其在什麼位置

像是 %中山路%

那不管是在哪個縣市也不管是幾段

只要是中山路都符合條件

瞭解了 LIKE 的用法

請想一想這段 SQL 的意思是什麼?

從 users 表格取出所有資料

並限定Address 欄位開頭為台北市的所有資料

[換頁]

在單元的最後我們再來學一下 DISTINCT

這個保留字雖然比較少出現

但某些時機還是很好用的

它的用處是幫你取出某欄位的所有資料

移除重複的內容

比如 City 這個欄位可能有五筆的台北市

還有三筆是高雄

透過 DISTINCT 就可以得到台北市和高雄市這兩個資料

剛好能用來作為選擇 CITY 的下拉選單

所以當你的下拉選單輸入項是要拿資料表的欄位作為選項的話

DISTINCT 就可以幫到你

回到投影片 請想一想這段 SQL 的意思是什麼?

從 users 表格取出所有的 City 欄位資料,但要去掉重複內容

[換頁]

這個單元就到這邊

如果這個單元的例子對你有些吃力

建議多看幾次或者到私密社團與其他會員討論喔

下個單元見 掰掰

5分
【 MySQL 】用 Insert, Update & Delete 來處理資料

你好,歡迎回到 Laravel 百萬年薪特訓營

在這個單元我將帶你去看一些編輯資料的 SQL 語法

也就是 INSERT . UPDATE 以及 DELETE

[換頁]

首先來了解 INSERT 語句

這是用來將資料寫入表格中

[換頁]

它的語法是先寫 INSERT INTO 保留字

接著寫要寫入的表格名稱

後面的小括號去指定要填入的欄位有哪些

後面接著寫 VALUES 保留字

後面的小括號對應著前面小括號的欄位

填入所要存入資料庫的值

[換頁]

我們來看這一個例子

它的目的是寫入一筆資料到 articles 表格內

INSERT INTO 是保留字用紅色表示

articles 是要寫入的表格名稱

title cgy 和 created_at 為要寫入的欄位

VALUES 同樣是保留字也用紅色表示

學習 Laravel和入門教程這些是要寫入資料庫的內容

now() 表示取當前時間

值得一提的是如果是 Laravel 專案的話

created_at 欄位存放的是資料新增時間

是由框架自行維護,你是不需要寫值到這個欄位的

updated_at 也是同樣的狀況

請注意一下這個部分

[換頁]

接著來了解 UPDATE 語句

這是用來變更表格裡頭的某一筆舊資料

[換頁]

它的語法是先寫 UPDATE 保留字

接著寫要變更資料的表格名稱

後面的 SET 是保留字

再後面接著寫要變更的欄位以及值

欄位與值之間用等號隔開

我個人習慣是會加上空格以隔的更開一些

可讀性會提高一些

但是不這樣做也是沒關係的

如果有多組欄位要變更的話則是用逗號來隔開

假如只是要變更該表格的某一筆資料而非全部資料

記得在後面加上 WHERE 條件語句來指定所要編輯的資料有哪些

[換頁]

我們來看這一個例子

它的目的是更新 articles 表格內

將某一筆 id2 的資料之標題改為學習 Livewire

UPDATE 是保留字用紅色表示

articles 是所要變更資料的表格名稱

SET 為保留字同樣用紅色表示

title = '學習 Livewire' 這部分說明要變更的欄位以及新值

再後面接 WHERE 保留字

說明限定 id 欄位為 2 的這筆資料才採用這個更新

[換頁]

最後我們來看 DELETE 刪除語句

這是用來刪除表格內的資料

因為帶有破壞性,使用上請特別注意

[換頁]

它的語法是先寫 DELETE FROM 保留字

接著寫所要刪除資料的表格名稱

假如只是要刪除該表格的部分資料而非全部

記得在後面加上 WHERE 條件語句來指定所要刪除的資料有哪些

[換頁]

我們同樣來看一個例子

它的目的是刪除 articles 表格內, id3 的資料

DELETE FROM 是保留字用紅色表示

articles 是所要刪除資料的表格名稱

WHERE 是保留字用紅色表示

後面的 id = 3 表示所要刪除資料的 id 欄位為 3

總的來說,透過 Eloquent 的協助,你是不需要自己寫這些語法的

但還是建議你以先看懂這些語法為目標

這樣在後續理解 Laravel 的程式碼結構上會有所幫助

這個單元就到這裡,我們下個單元見

掰掰

5分
【 MySQL 】用關聯 ( Relationship )來串起多個表格

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我們來聊聊表格之間的關聯是怎麼回事

[換頁]

所謂的關聯 Relationship 是 MySQL 這類關聯式資料庫的重要功能

目的是將資料庫裏的資料表串連起來

有助協助資料的管理、編輯並節省磁碟空間

在處理資料時如何化繁為簡是非常重要的

假如你只使用一個資料表格來儲存網站資料時

你會發現像是文章分類、文章作者等等這些欄位的資料會重複出現

更糟的是隨著資料儲存越來越多且讀取的時間也越來越長

讓你從資料表中找到所需的欄位越來越費勁

為了有效解決這個問題

資料庫分析師會依照資料的相似性

將上述資料表中的部分欄位獨立成新的資料表

這個作業稱之為資料庫正規化

再搭配關聯方法來將這些資料表串連起來

最終達到兩個優點,那就是避免重複輸入及避免輸入錯誤

[換頁]

你或許不明白為什麼這樣做可以避免重複輸入

我們來看一個例子

你認為輸入勞動部勞動力發展署高屏澎東分署

跟輸入代碼 05 哪一個比較省時間

答案顯而易見

[換頁]

那你再想想,如果要輸入的資料超過百筆以上的話

那能夠節省你多少時間呢

因此透過將重複性高的資料移到其他資料表

設定關聯後再以代碼作為外鍵來對照可以省掉很多輸入時間

除此之外還能節省資料的儲存空間

[換頁]

關聯對於人為輸入錯誤也能有效的避免

俗話說吃燒餅哪有不掉芝麻的

只要是透過人工連續輸入資料難免會發生錯誤

如果一不小心像是把土木工程系給打成圖木工程系

原本應是相同分類的資料就可能因為輸入錯誤而查詢不到

但使用關聯後再以代碼輸入就可以相當程度上避開這類問題

此外關聯在批次更動眾多內容時也非常好用

比如將欄位值土木工程系改成土木工程所

那麼原先標示為土木工程系的資料欄位

將因為資料表關聯的關係就得以自動變更為土木工程所了

[換頁]

表格間的關聯是透過主鍵與外鍵來實現的

這裡我就來為大家介紹這兩個特殊欄位

先來看主鍵

在資料表中如果具備唯一識別特性的欄位可選作資料表的主鍵之用

而所謂的唯一識別代表該欄位值不會重複

例如身份證字號或者是 ID

作為主鍵的欄位往往會作為資料庫索引使用來增進查詢效率

在表格沒有單一欄位具備唯一性時

有時會使用兩個欄位合併作為主鍵,這就稱為複合主鍵

但要特別提醒你的是

Laravel 8 尚未支持複合主鍵

你需要自己實作這種查詢方式

Laravel 偏好你以名為 id 的欄位作為主鍵

內容為流水號

這樣做你將可以更輕鬆地去找出對應資料

接著來看外鍵

資料表中與其他表格的主鍵做關聯之欄位被稱為外鍵

此欄位名稱不一定要與關聯的資料表主鍵相同

但會有命名慣例

如果你沒有按照慣例去寫的話

你的關聯程式碼就要寫得更囉唆一些

因此就來看看它的命名慣例是什麼

外鍵的欄位名稱建議是對應表格類別名加上 _id 作為後綴

比如 users 表格的外鍵欄位最好命名為 user_id

[換頁]

接下來我想要為大家介紹資料表關聯的三種類型

包含一對一. 一對多以及最複雜的多對多

我以工作佈告欄網站來舉例

假如每一個工作項目對應一個分類的話

站在工作項目的角度來看

工作項目和分類的關係就是一對一

反過來説每一個分類可能會有多個工作項目

因此站在分類的角度來看

分類和工作項目的關係就是一對多

因為工作佈告欄網站大受歡迎的關係

你追加了使用者可以去申請工作的功能

現在每個使用者可以申請多筆工作

此外每個工作也能有多個使用者

在這樣的設計之下

不管是站在使用者還是工作的角度

它們的關係都是多對多

[換頁]

我們先從最簡單的一對一來學習

剛才有說到每一個工作項目將對應一個分類

這裡有兩個表格,分別是 tasks 工作項目以及 cgys 分類

我必須先承認 cgys 不是個好的命名方式

Laravel 更希望你命名的是 cgies

請先見諒我的菜英文

下圖標示了 tasks 與 cgys 表格的欄位及其關係

cgys 資料表的 id 欄位是主鍵

而 tasks 資料表中 cgy_id 欄位則作為 cgys 資料表的外鍵

兩個表格的關聯我以綠色線條來標示

這裏可以發現外鍵欄位設計上會被放在一對一的視角表格上

也就是這個例子中的工作項目

[換頁]

下一個一對多往往和一對一是相對的

所以搞懂一對一接著學一對多就不難

一樣是工作項目和分類這兩個表格

但這次我們站在分類的角度來看

每個分類會有一個以上的工作項目

這情況就稱為一對多

也就是說不管是否真的有多個工作項目

只要是有可能就被視為一對多

了解的話再回去看剛才的例子

你已經學到了外鍵欄位是被放在 tasks 資料表中

今天分類需要找出與它對應的工作項目

只要到 tasks 資料表中去找出 cgy_id 欄位的值與它的主鍵相同即可

也就是說 cgys 資料表的主鍵 id 欄位與 tasks 資料表的 cgy_id 有關聯

[換頁]

最後來看看比較複雜一點點的多對多

多對多的複雜之處在於外鍵不會被放在關聯表格的任何一方

而是必須再創造一個新的資料表作為中介表

Laravel 稱這個中介表為 pivot

你需要把外鍵設計在這個中介表裡頭

比如在新功能中

每個使用者可申請多筆工作

反過來說每個工作也能有多個使用者

因此 users 表格以及 tasks 表格就存在著多對多關係

這情況之下你就不能把外鍵設計在 users 或 tasks 任何一方

而必須新增一個名為 task_user 的 pivot 中介表格

這表格命名同樣是有命名慣例的

首先是需要使用兩個表格類別名稱

並在中間用下橫線連接起來

至於哪一個類別名稱在前面就要看A到Z的排序

在這個例子當中 t 在 u 前面

所以中介表格最好就命名為 task_user

這是 Laravel 預設會去找的表格名稱

在中介表格中會同時存在 users 以及 tasks 表格的外鍵

外鍵命名慣例和一對一與一對多完全相同

中介表格與兩個表格的關聯我同樣以綠色線條來標示

這個單元的內容比較多

但我認為關聯對於 MySQL 資料庫是很重要的一個特色

還請你務必搞懂主鍵與外鍵的分別

還有一對一.一對多.多對多這三種表格關聯

最後命名慣例太重要了

請務必記在你的技術筆記裡頭

這個單元就到這邊

我們下個單元見 掰掰

11分
【 Laravel 】設定串接 MySQL 資料庫示範
mb
【 Laravel 】物件關聯對應資料庫 Eloquent ORM

你好,歡迎回到 Laravel 百萬年薪特訓營

在這個單元我將教你一個很重要的 Laravel 資料庫存取機制

那就是 Eloquent ORM

請你準備好技術筆記本把重點記下來喔

好了就讓我們開始吧

[換頁]

首先,從 Eloquent 初探開始聊起

[換頁]

你是否還記得我們在 MVC 架構單元看過類似這張圖

你已經知道控制器是透過 Model 來取得資料

這一次我們將關注於容器內的 Model

更精準的說是探究到底 Model 是如何存取資料庫的

[換頁]

在談 Eloquent 之前我有必要說說 Active Record

所謂 Active Record 是一種技術標準

就像是安全標章一下

只要你有符合指定的安全標準就能說有支援某安全標章

而符合 Active Record 的技術需要具備三大特性

分別是能提供與資料表互動的能力

每個實例能代表某一筆單獨資料列

以及每個實例能管理自我的持久保存

我就來好好的給你說說這三大特性

提供資料表互動能力應該好理解

就是說你不需要自己寫 SQL 由技術幫你搞定互動問題

能代表某一筆資料列也算好理解

也就是說表格內的資料能被轉化為一個物件

等你之後看過程式碼就更好懂了

第三個特性的自我以及持久保存

就會讓新朋友有些矇逼了

所謂的自我指的就是剛才第二特性所指的那個物件

它既代表表格內的某筆資料

又有能力能更新資料表內的內容而不需要透過 SQL

至於持久保存看起來文謅謅

但在網頁程式世界內大多指的就是將資料存入資料庫的意思

這樣的話 就算被拔插頭了

資料仍不會消失所以叫持久保存

在介紹 Active Record 你應該也發現到我不斷地說不用寫 SQL

所以我才說之前教你 SQL 是給你觀念而不是叫你背語法

因為有支援 Active Record 的 Eloquent 會幫你搞定語法

沒錯

Eloquent 就是一種 Active Record ORM

那什麼又是 ORM 呢

Object Relationship Management

中文可翻譯為物件關聯資料庫管理

也就是把每一筆資料當作是物件來看待

讓物件之間具備關係來進行管理的架構

這讓你在存取資料時更為直覺且好懂

是不是很讚啊

在 Laravel 導入 Eloquent 之後

你只需要定義表格的對應模型

就能夠讓你輕鬆的存取資料表的內容

一般來說通常一個模型只會對應某一個表格

比如 User 類別用來對應 users 表格

[換頁]

講到這裡你可能還不是很清楚 Eloquent 厲害在哪

我舉個生活中的例子給你聽

假如你今天想喝可樂

第一步你需要先打開冰箱 沒錯吧

第二步你需要把可樂的蓋子轉開

最後一步如果你講究點

可能還需要再插根吸管

最後喝到了冰涼的可樂

因此我是不是可以這樣說

你的目的是喝到可樂

但你做了三個和目的無關的動作

[換頁]

同樣的道理我們轉換到 PHP 程式的場景內

假如你的目的是想要取得使用者表格中的資料

你就要寫這些藍色字的程式碼

它們分別做了哪些事情呢 我們一一來看一下

第一步先連線資料庫

第二步要確認一下連線是否有成功

畢竟網路不一定是通的而資料庫軟體也不見得有提供服務

第三步設定連線的編碼

這裡用 UTF-8 才能支援中文

第四步進行查詢

這一步才是我們真正的目的

第五步當我們的目的結束之後還不能休息

必須要關閉連線才行

這樣才能把資料庫資源讓出來給其他程式使用

在這個場景中我們的目的是取得使用者資料

但我們多做了四個和目的無關的動作

好累喔,你心裡是不是開始這樣想了

[換頁]

現在 Eloquent 出來拯救你了

你再也不需要做那些和你目的無關的操作了

由 Eloqeunt 的 Active Record 特性來幫你搞定

你只需要專注於進行查詢即可

以後你的程式碼終於可以和街邊正妹的迷你裙一樣短了

真是太美了 讚

[換頁]

我們花了一點時間

應該能讓你明白 Eloquent 是什麼呢

接下來就來説説該如何啟動 Eloquent 機制吧

也就是設定表格的模型 Model

[換頁]

我還是用生活的觀念來解釋好了

假如你今天想要去拿一個東西

你會怎麼做

還不簡單 用手拿對吧

但假如是拿一堆東西呢

這時候用手拿就不是那麼有效了

反而應該是用包包來存放才方便

而資料表內的資料因為有多個欄位

就很接近一堆東西的概念

所以我們需要用一個包包來封裝這些資料

這個包包就是你接下來要新增與設定的模型 Model

這個模型本身已經實作了 Eloquent 黑科技

因此可以協助你抓取資料

實現資料庫連線.讀取以及寫入等功能

也像是個包包一樣

可幫你把多種資料類型打包成一個物件

我知道你還是覺得有點抽象

沒關係 我們來看下程式碼就更明白了

[換頁]

當你的應用需要進行資料庫存取時

多半可透過 Model 來執行相關作業

而這些 Model 都有實作 Active Record 技術

每一個 Model 類別所生成的實例都代表某一筆資料

這符合 Active Record 的第二個特性

透過 Model 類別的協助讓你存取資料庫超便利

在程式碼當中你可以看到每一個 Model 類別

都會繼承 Model 類別

那些便利的黑科技都是從這個父類別而來

[換頁]

我知道你肯定想知道究竟要如何得到這個 Model 類別

別急 現在我就要介紹給你了

Laravel 已經提供了一個簡單的方式讓你生成模型類別檔案了

就是透過 make 指令

你可以開啟 Terminal 輸入這段指令

把 name 替換成你的模型名稱

比如這個例子當中的 Task

所以千萬不要自己打啊

又累又容易打錯字

[換頁]

在生成 Model 類別的過程中有一些事情你最好知道

這些檔案的名稱將與類別名稱相同

而且從 Laravel 8 開始會被存放於 app/Models 資料夾裡頭

在 Laravel 7 之前則是在 app 資料夾內

Laravel 所希望的表格名稱是有命名慣例的

模型所對應的表格名稱一般為首字母是小寫而且是複數型

比如使用者表格就該取名為 users

還有一件小事就是

其實你可以在生成模型類別時一起生成 Migration 檔案

至於什麼是 Migration 檔案我後續單元會說

你只要先知道在這階段就可以生成

好處是可以省去一個指令的工序

做法是在指令的後面加上一個 m 或 migration 的選項

兩個功能一樣所以當然打 m 最方便

[換頁]

有些朋友可能不明白明明生成出來的 Model 類別沒幾行程式碼

為什麼就能夠提供 Active Record 的三大特性

關於這個問題的答案

我實在很想舉一個生活例子就是

郭台銘的兒子任何事情都不用作

只要他老爸是郭台銘很多事情都能夠搞定

包含創業都可以任性

說回來 Model 類別

它的 ORM 機制是來自於它所繼承的父類別 Model

所以就算什麼都沒有,但就是什麼都做得到

我絕對不承認我用了動物森友會的梗

[換頁]

我多次向新朋友們強調命名慣例對於 Laravel 入門的重要

所以我準備用這張投影片來幫你做個整理

針對資料表格名稱

因為表格會包含多筆資料

命名請以英文.複數以及全小寫來取名

如有多個單字的話之間用蛇底式命名法 case_snake 來處理

也就是在單字間用下橫線隔開

比如工作表格就用 tasks

針對模型名稱

因為是對應表格的某一筆資料

命名請以英文.單數以及首字母大寫

如有多個單字的話之間用大駝峰式命名法 UppserCamelCase 來處理

也就是每個單字的首字母為大寫的方式

比如工作模型就用 Task

當然你還是可以很任性的無視這些命名慣例

只是你將會付出做更多設定以及面對紅色錯誤攻擊的代價

所以為了更美麗的輕鬆人生

請把這張投影片的重點寫進你的技術筆記本中

[換頁]

針對沒有按照命名慣例去命名的朋友

我來說明一下該如何進行設定

因為你沒按照慣例命名你的表格

這導致 Laravel 將找不到對應表格而爆出紅色錯誤攻擊

這時候就需要你自己指定正確的表格名稱為何

做法是為模型類別加入屬性 table

像這個例子中因為所設定的表格名稱 tasks 有符合命名慣例

是可以不用寫的

[換頁]

接下來我再分享一些類別可以做的進階設定

它們都是非必須但在某些情況下是有用的

[換頁]

每一個表格預設都會有兩個時間戳記

分別是 created_at 和 updated_at

這兩個欄位由 Laravel 代為管理

幫你記錄資料建立以及更新的時間

它們的型別是 Carbon

因此自帶強大的時間計算功能

假如你自己建立了一些時間戳記欄位

比如商品的何時上架欄位

你其實可以讓這些自建欄位都轉為 Carbon 型別

透過將它們列在屬性名稱為 dates 的陣列內即可

關於 Carbon 的更多資訊

我會把資料整理在課程資訊內

[換頁]

假如你表格的主鍵不是使用 Laravel 所預設的 id

那就必須要進行設定來告訴他正確的主鍵欄位

透過加入屬性 primaryKey

[換頁]

假如更不幸的你表格的主鍵型態不是流水號

而是字串加數字這種類型

我知道很多台灣的資料表格的主鍵喜歡這樣設計

但 Laravel 其實一點都不喜歡這種主鍵設計

在這種情況下你需要關閉主鍵的自動新增特性

否則就會引來更多的紅色錯誤攻擊

做法是加入屬性名稱為 incrementing 並將值設為 false

有這個困擾的朋友肯定會想問我

可是公司的表格就這樣設計啊 不然怎麼辦?

我的建議是這個欄位可以保留但另外新增一個 id 欄位作為主鍵

這樣公司的序號欄位資料可以保留

又可以滿足到 Laravel 喜歡用流水號做主鍵的需求

[換頁]

剛剛我只是介紹幾個 Model 比較常用的屬性

其實還有更多等著你來使用

我會把相關資料的連結放在課程資訊供你參考

[換頁]

這堂課程有個作業

希望你已經決定自己的作品了

請構想所需要的表格名稱並生成其對應的 Model 類別

有時間的話歡迎去看一下官網了解 Model 還提供你哪些額外的屬性

最後試看看為你的表格 Model 加入所需要的模型

我知道現在你還不懂得如何利用它來存取資料

所以也無法確認這些模型類別到底有沒有用

沒關係 就先產生這個類別就好

然後告訴自己做得好

很快你就知道到底有沒有用了

我們下個單元見 掰掰

--------------------------------

參考資料

Carbon 類別 https://carbon.nesbot.com/docs/

Carbon日期及時間處理包 https://iter01.com/573850.html 

Laravel 官網 Eloquent 說明 https://laravel.com/docs/8.x/eloquent

16分
【 API 開發 】Migration 語法示範
5分
【 API 開發 】用 Migration 來建立資料表

你好,歡迎回到 Laravel 百萬年薪特訓營

是時候來玩一些有意思的東西了

這個單元我將要教你如何透過 Migration 來自動建立資料表

[換頁]

首先我想先告訴你該如何實作 Migration

[換頁]

不過,在我們開始上路之前

為了讓你能有段舒服順暢的旅程

還是請你先確認一下是否有先建好要給專案使用的資料庫

請開啟 phpMyAdmin

它的預設網址是 http://localhost/phpmyadmin

假如你還沒建立的話

請你先按這個新增連結來建立新資料庫

輸入名稱,建議用蛇底式命名法來命名

選擇編碼為 utf8mb4_general_ci

完成之後按下建立來生成資料庫

[換頁]

我們來看一下資料庫的設定

設定檔位於 config 資料夾內的 database.php

這個設定檔可以同時儲存多種資料庫來源的設定

比如 MySQL 的設定就位於 key 為同名的陣列內

[換頁]

現在我想讓你明白該如何設定資料庫參數

default 是用來設定預設的資料庫來源

原始設定為 mysql

connections 裡頭就包含了各種資料庫連接的設定

像是 host 存放資料庫伺服器的 IP Address

port 存放資料庫伺服器的阜號

database 則是資料庫的名稱

其他的看名稱大致上都可以理解

[換頁]

你比較會困惑的會是到底這個 env() 是做什麼用的

它的用途是讓設定檔先到 .env檔案去找對應 key 的值

如果找到就回傳

如果找不到則回傳第二參數的預設值

讓我舉個例子來幫助你了解

database.php 設定檔裡頭有個 key 為 host

它是這樣寫的

表示會到 .env 檔案去找名為 DB_HOST 的 key

剛好 .env 檔案內有這個 key 因此就回傳 127.0.0.1

假如找不到的話就會回傳 localhost

名為 port 的 key 也是相同的道理

最後會回傳 33060

[換頁]

Laravel 是透過一個名為 migrations 的表格來管理 Migrate 作業

要生成這個表格可以透過這個指令來達成

如果失敗的話就會出現紅色錯誤

問題多半是在於資料庫還沒有建立又或者是帳號密碼設定錯誤

請逐一確認後解決即可

如果成功的話就會像這張圖一樣

你也可以到 phpMyAdmin 檢查看看是否多出了一個表格

[換頁]

現在你看著這個憑空跑出的表格

應該會很好奇這個表格怎麼用

這張投影片就來為你說明

這張表主要是紀錄資料表異動的歷程與批次

它主要有兩個欄位分別是 migration 和 batch

當某個 Migration 檔被執行之後它的名稱就被寫在這裡

用以表明該 Migration 檔案已經執行完成

batch 則是用來說明該 Migration 是第幾批被執行的

比如第一批執行的 Migration 的 batch 就是 1

相同的邏輯你就能夠推論出同一個 batch 表示為同一批的異動

另外還有一個重點你需要知道

當你執行時 migrate 時會從 Migration 時間最早的先執行

後面我還會再提到

你先記得這件事即可

[換頁]

我想補充一些細節給你知道

這些是別人曾經問過我的問題

第一個問題是如果找不到 .env 檔案怎麼辦

現在的 Laravel 專案生成時就已經有 .env 檔案了

就算沒有也一定會有 .env.example 範例檔

你可以拿這個檔案複製出 .env 檔來修改

第二個問題是 Laravel 找不到 .env 會讀取 .env.example 嗎

答案是否定的,你必須自己修改

第三個問題是能否在 .env 檔案內加入更多自定義設定

當然是可以喔

而且你要使用參數的時候,同樣是呼叫 env() 來取值

[換頁]

我也想再介紹一次 make 系列指令

雖然我們之前已經見過他們的部分指令了

請記得 Laravel 有幫你準備一系列的 make 指令用來生成檔案

[換頁]

比如要生成 Migration 檔案的時候

就可以使用 make:migration

Migration 的名稱建議先寫目的為何

比如新增表格就寫 create

接著寫表格名稱,比如 orders

最後固定寫上 table

各區塊之間用下橫線隔開

就像這樣 create_orders_table

如果你希望它幫你生成更完整的內容

還能加上 create 和 table 選項用來表明作業表格名稱

但新的版本似乎已經可以自動偵測

所以不一定要加上這個選項了

我自己一般是沒加這些選項

[換頁]

又到了命名慣例時間

當你用指令產生 Migration 檔案時

程式會自動產生時間戳記放在檔名前,像這樣

預設檔案的命名規則是以動作_資料表名稱_table 這樣的組合

以底線作區隔採用的是蛇底式命名法

資料表名稱之前已經說過是以複數命名,且採小寫

[換頁]

這個問題你大概有九成的機會不會發生

但考慮到會有一成的學員刪了又生成同名 migration

就會因為快取關係導致錯誤

所以我還是說一下

這個錯誤很容易在你除後又生成同名 Migration 時發生

解法就是更新快取紀錄檔

指令為 composer dump-autoload

[換頁]

你已經了解了不少 Migration 的細節

接著,我想讓你了解 Migration 的用途

它主要適用於新增及變更資料庫表格

比如當你想要為資料庫新增一個表格時

Migration 就非常的好用

[換頁]

我還是舉個生活的例子來幫助你理解

志明與春嬌除了是一對戀人之外

他們還希望一起開發新的網頁專案

因此他們就需要能擁有相同的資料庫表格結構

志明就開始想辦法解決這個問題

[換頁]

志明想到的第一個作法是用 GUI 建立資料表結構

所謂 GUI 指的就是我們所用的 phpMyAdmin

然後把操作步驟寫給春嬌

這個作法很糟

除了志明得要寫一大堆的操作步驟之外

春嬌也得做大量的操作

更別提在過程中只要有任何操作錯誤

將會導致兩人的資料表結構不一致

[換頁]

志明的第二個作法就比較靠譜一點了

他想到用 SQL 檔建立資料表結構

再把 SQL 檔發給春嬌去執行

可是春嬌在執行時卻發生了錯誤

這種問題比較少見但還是可能的

原因多半是因為使用的資料庫管理系統不一樣

比如志明用的是 MySQL 而春嬌用的是 MSSQL

[換頁]

志明又想到了一種新作法

就是乾脆把自己的資料庫放到雲端上

讓春嬌可以連上去

這樣看似完美解決問題

但卻又誕生出兩個新問題

第一個問題如果沒有網路就無法進行開發

第二個問題是彼此的操作會互相影響

[換頁]

最好的解決方案就是使用 Laravel 的 Migration 來描述表格結構

這樣的話

春嬌用任何一種資料庫軟體都不怕了

而且還能有版本控管功能

[換頁]

沒錯

哥布林工程師誠心推薦

Migration 可跨資料庫使用

又能將變更納入版本控管

實乃居家旅遊,防疫必備良藥....

[換頁]

當我們的專案開發導入 Migration 有哪些好處呢

第一能確保團隊取得相同的資料庫結構

這也就是志明與春嬌最需要的功能

能有效提升團隊協作能力

第二是將資料表的新增改由程式自動執行

因此避免人為錯誤的發生

第三是當表格變更中途如有問題還是可以還原到早期版本

善用還原功能讓你的開發更放心

第四是它有點類似資料庫界的版本控管功能

讓你有效管理表格結構的異動

[換頁]

Migration 機制簡單可分成兩個階段

在第一階段產生並編輯 Migration 檔案

Migration 是名詞

重點是設定表格的欄位規格

資料庫實際上沒有任何異動

在第二階段是執行 Migrate

Migrate 是動詞

意即將 Migration 的設定付諸執行

用以異動資料庫結構

[換頁]

這裡我為你整理了 Migrate 的五個步驟

第一步 生成 Migration 檔案

第二步 編輯 Migration 檔案的內容

第三步 執行 Migrate 指令

第四步 用 GUI 來確認異動是否正確

第五步 測試看看 Rollback 是否也能正確還原

[換頁]

接著來看看 Schema 的語法

[換頁]

每個 Migration 檔案都會分成 up() 和 down() 兩個方法

在這個例子中 up 負責建立 orders 表格

至於 down 則負責移除 orders 表格

看看這個結構讓你想到了什麼

在下張投影片我將為你公開答案

[換頁]

有個原則你要知道

就是每個 Migration 檔必然包含 up()down()

這兩個方法所做的異動應該要互為平衡

也就是說當 up 和 down 各執行一次就會互相抵銷

up() 主要是寫這個 Migration 想要做的異動

通常會是新增某一個表格

down() 則是還原 up() 所做的異動

比如 up() 新增了一個表格的話 down() 就要刪掉該表格

[換頁]

入門 Laravel 的新手在看到 Schema 時往往會有點困擾

想說建欄位為何不乾脆直接寫 SQL 就好

搞那麼麻煩幹什麼

這不是擾民嗎?

No No No ,這樣你就錯怪 Laravel 了

使用 Schema Builder 的優點

一句話可以解釋就是

讓你同一段程式碼,卻能支援多種資料庫

最終達到降低耦合度的目的

就像是生活中可見的萬用螺絲起子

只要換掉前端就能夠兼容各種的螺絲而不需要更換手把

Schema Builder 就是你的萬用螺絲手把

哪一天你把資料庫轉換到 MSSQL

只要改資料庫設定就能夠無痛轉換囉

[換頁]

理解了這點

你應該比較能接受 Schema Builder 看起來有點複雜的外觀了吧

不過其實看久了一點也不難

我來為你解說一下它的語法結構

我們能利用 Schema 這個 Facade 的靜態函式來變更表格

比如 create() 用來建立表格

rename() 用來將表格更名

drop() 和 dropIfExist() 則是用來刪除表格

你經常會見到 ifExist 作為後綴的函式名稱

它們的特性都是相同的

我以 dropIfExist() 來舉例說明

它將會先確認該表格是否存在

如果存在才會進行刪除

假使不存在則當作沒事情發生

但 drop() 則會堅持要刪掉該表格

如果表格不存在可是會報紅色錯誤的

[換頁]

接著談欄位異動的部分

如果要變更某表格的欄位

要使用 Schema Facade 的 table()

在裡頭去撰寫要異動的欄位新規格

要重新命名欄位則是像這樣透過 renameColumn()

但要注意的是你必須再安裝 doctrine/dbal 套件才能使用此功能

假如是要刪除某個欄位的話

則是透過 dropColumn()

[換頁]

當你在新增 Migration 檔案時

它就會幫你建立好主鍵欄位

8.0 以上的版本是透過 id()

或者你也是可以寫成這張圖的寫法

結果是一樣的

如果是從舊版本升上來的有件事情提醒你注意

現在 Laravel 專案已經能夠支持巨量資料了

所以預設的主鍵必須是大整數級別了

所以 increments 前面必須要有 big

相對應的外鍵也必須是大整數級別

否則也是會被紅色錯誤攻擊的唷

還有一件事容我嘮叨一下

因為這個欄位是作為未來搜尋 MODEL 的主要依據

不管你的表格設計是否需要

我都強烈建議你保留

[換頁]

接下來看到的是預設的時間戳記

這也是生成 Migrations 檔案就會自帶的

這行程式碼會生成 created_at 和 updated_at 這兩個 Carbon 欄位

Laravel 會幫你自動管理

我會建議你保留這兩個欄位

如果你真的決定狠心砍掉他們

別忘了到模型類別去告知 Laravel

否則又是老話一句

你等著被紅色錯誤攻擊吧

[換頁]

這張投影片是展示給你看該如何去設定表格的欄位

呼叫 $table 的 boolean() 能建立一個布林值欄位

欄位名稱用參數傳入

integer() 則是能建立一個整數欄位

欄位名稱仍舊是用參數傳入

其他型態就依此類推

供你做個參考

有個型態比較特殊就是字串 string

參數的部分除了要改欄位名稱之外

還要提供第二參數去設定欄位的長度

長度建議不要設的太小

當存入的內容超過字串的長度就會報錯

也請你要注意一下

timestamp 和 datetime 有些類似

我自己都是用 timestamp 比較多

[換頁]

在宣告欄位以及型態之後

你還可以在後面加上特性作為補充

比如在 string() 後面串上 nullable()

就可以讓這個字串欄位可接受空值

default() 可設定欄位的預設值

unique() 讓該欄位的資料必須為唯一值

通常用於身分證字號或 E-mail

unsigned() 讓該欄位不得為負數

[換頁]

當 Migration 檔案編輯完畢之後

就可以準備執行 Migrate

讓設定在資料庫裡頭呈現了

[換頁]

Laravel 提供了一系列的 Migrate 指令

方便你玩出資料庫界的版本控管機制

我個人最常用的除了基本的 migrate 之外

搭配 rollback 可以回到上一個狀態

搭配 refresh 來達到清空資料的效果

如果我想把整個資料庫清空的話

可以搭配 reset 回到資料庫狀態起點

[換頁]

如果剛才說的那些你還沒搞懂

不用擔心

因為你有八成以上的機率只會用到這一招

那就是 migrate

畢竟辛苦撰寫 Migration 檔的目的就是為了執行 migrate

否則資料庫變更是不會被套用的

Laravel 會去檢查 migrations 並比對 migrations 資料夾

找出還沒被執行的 Migrations 檔案

然後全部納入作為同一個批次來執行

完成之後再把這些異動 Migration 檔案寫入 migrations 表格中

[換頁]

如果是 8.x 以前的專案

往往會看到這個因為 MySQL Bug 所導致的經典紅色錯誤

解決方案分兩種

第一種把專案升到 8.x 就不會有這個 Bug 了

第二種則是到 AppServiceProvider.php 的 boot()

加入這一行程式碼也是可以解決

但別忘了加上第六行的載入 Schema 命名空間唷

[換頁]

如果執行 migrate 一切順利的話

你就可以開始 phpMyAdmin 或其他資料庫管理工具來看看

資料庫是否有正常發生異動囉

[換頁]

之前有說過當要進行一些比如欄位名稱修改的操作

需要搭配 doctrine/dbal 套件

這邊也說明一下你該如何進行下載

只要開啟 Terminal 並輸入這段指令即可

[換頁]

這一個單元的內容很多

也有不少需要練習的地方

我強烈建議你好好去練習我給你的作業

首先請構思你的作品網站所需要的表格

接著將你需要的表格結構寫成 Migration 檔案

然後試看看能否用 migrate 等指令來正確執行並解決所出現的錯誤

最後用 PhpMyAdmin 來確認表格是否正確生成

這個單元就到這邊 我們下個單元見

掰掰

21分
【 API 開發 】Seed & Faker 語法示範
7分
【 API 開發 】用 Seed & Faker 來建立資料

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我將為你說明該如何建立大量的假資料

透過 Seed 與 Faker 機制

[換頁]

首先從 Seeding 初探開始聊起

[換頁]

Seeding 在 Laravel 框架內的用途就是用來生成資料

而且絕大多數情況下都是用來測試應用的假資料

就像畫面上的這筆資料一樣

用來測試應用是否能夠正常顯示

[換頁]

開發者在開發資料庫程式時

往往需要大量的測試資料以便測試程式或頁面是否正常

我之前在測試連接電子發票大平台之時

就需要生成 1000 筆發票資料來做壓力測試

當用 Seed 來產生作測試的假資料

這些生成的資料需符合表格欄位的屬性

比如姓名欄位就不應該生成數字資料

實作 Seeding 機制的做法是透過撰寫 Seeder 類別

藉此建立資料生成程式化

就可以搭配指令來建構資料表裡的資料

是不是很類似 Migration 的概念呢

[換頁]

如果你問我為什麼需要 Seeding 技術

我認為有三個原因

第一在開發應用並測試的過程中

往往需要重複的產生大量的假資料

但建立大量而真實的假資料又非常的花時間

人生不應該把時間花在建立假資料上

第二可根據腳本來生成資料

也就是說 Seeding 腳本可自動完成測試資料生成

並確保團隊每個人都有相同的資料

第三輸入指令最方便

有了 Seeding 開發者不需要其他工具

只要下指令就能執行資料生成作業

[換頁]

是時候來進一步聊聊 Seeding 的細節了

首先來看看這個 DatabaseSeeder.php 檔案

因為 Seeder 類別彼此各自獨立

這個檔案常作為 Seed 執行的起始點

裡頭只有一個 run()

在裡頭去呼叫需要執行的 Seeder

關於 Seed 的指令為 db:seed

當需要 Seeding 的時候

可以透過此指令來完成資料產生或刪除等工作

[換頁]

接著來聊聊該如何實作 Seeding

[換頁]

Seeding 的開發流程分成五個階段

第一階段透過指令來生成 Seeder 檔案

第二階段撰寫 Seeder 檔案的內容

第三階段撰寫 DatabaseSeeder 檔案的內容

第四階段執行 db:seed 指令

第五階段從 GUI 確認執行後結果

[換頁]

來細細地說一下究竟如何用指令來生成 Seeder 檔案

Laravel 提供 make:seeder 指令來產生 Seeder 檔案

一般的情況下每個檔案會對應到一個表格

這概念跟 Migration 檔案也很類似

在指令的後面接要生成的檔案名稱

在 8.x 版本時,Seeder 的預設命名會是模型類別名加上Seeder

比如訂單的 Seeder 檔案就會是 OrderSeeder

Seeder 檔案內就跟 DatabaseSeeder 一樣

只有一個 run() 而已

[換頁]

那這些生成的 Seeder 檔案會存放在哪裡呢

答案是 database 資料夾的 seeders 資料夾內

這個資料夾名稱在 7.x 以前是叫 seeds

也是到了 8.x 才被更換為 seeders

在命名 Seeder 檔案最好能按照命名慣例比較好

但根據我的測試沒按照命名規則影響倒不是很大

因為所有的 Seeder 多半是要靠自己去呼叫的

[換頁]

接下來我們進一步的去看看 Seeder 檔案的結構

裡頭就如同之前所說只有一個 run()

讓你在裡面撰寫生成資料的程式碼

就如同這段範例程式碼這樣

首先用模型的 truncate() 來刪除資料表的所有資料

完成後再用模型來生成資料

[換頁]

剛才有提到刪除表格內資料的話題

所以我來幫你整理一下相關的知識點

你主要有兩種做法來刪除表格內的資料

一種是用 DB Facade 取出表格後搭配 delete()

這種做法流水號的計數器不會重置

這個計數器是做什麼用的呢

之前有提過表格的主鍵是流水號會自動新增對吧

如果計數器沒重置的話

就算資料被刪光光

主鍵也不會從1開始算

另一種則是剛提到過模型的 truncate()

在刪除之後流水號的計數器會重置

所以一般來說第二種做法比較乾淨一些

[換頁]

那究竟假資料是如何被生成的呢

真相就是透過模型的 create() 來生成

這個方法接受一個陣列

陣列內的鍵為 表格欄位名稱

鍵對應的值就是要存入該欄位的資料

比如這個例子就寫入了 title 與 sub_title 欄位

[換頁]

Seeder 檔案撰寫完了之後

接著就要設定 DatabaseSeeder 了

這是因為 seeder 檔案不會自己執行

必須被動經由 DatabaseSeeder 來呼叫

它是作為 Seeding 的起點

最主要是透過其本身的 call() 來呼叫各個 Seeder

至於哪支 Seeder 要先執行完全由你自行呼叫來決定

像這個例子中就是先生成 posts 表格的資料

接著才生成 comments 表格的資料

就不會產生資料關聯的錯誤

如果不想要考慮表格生成先後順序的問題

又怕產生資料關聯的錯誤

在生成資料前先關掉外鍵偵測

等到資料都生成完畢後再打開就是一個簡易的做法

但這段範例碼的做法只支援 MySQL 資料庫

需要特別注意

[換頁]

終於我們搞定了一切檔案

萬事俱備只欠東風了

執行 Seeding 就是利用 db:seed 指令

當這個指令被呼叫之後就會呼叫 DatabaseSeeder 的 run()

再透過它來呼叫你所生成的其他 Seeder 的 run()

就如同多米諾骨牌一樣

但其實 db:seed 還有一招隱藏必殺技

就是你可以不透過 DatabaseSeeder 直接呼叫指定的 Seeder

透過加入名為 class 的選項即可

對應的值自然就是所要呼叫的 Seeder 名稱

[換頁]

當生成假資料時如果所有資料都長得一樣

實在太無趣了點

所以這小節來介紹一些簡單的小花招讓你擁有隨機的資料

[換頁]

隨機策略的第一種做法就是利用 rand() 來生成隨機數字

比如我們有個 is_feature 欄位的型態是布林值

我們就可以這樣寫來生成隨機的布林值

如果欄位型態是日期的話

你還可以搭配 Carbon 類別來生成出其他的日期

像這個例子中取出今天日期再搭配 addDays() 來轉成昨天或明天

[換頁]

如果你還不熟悉 Carbon 類別的話

那就太不應該了

我的意思是今天趕緊好好補課一下

Carbon 可是一個非常強大的日期運算類別

在這裡我先列出幾個我覺得很常用的函式

實際上它能做到的遠遠不止如此

你可以透過 parse() 來把日期字串轉成 Carbon 物件

接著就能夠逐一的取出年月日時分秒資料

是不是非常的實用呢

還有我最驚豔的 diffForHumans()

能用於部落格或貼文常見的像幾天前這種口語化時間表達形式

[換頁]

如果剛才所教的幾招你都覺得不酷

是時候拿出我的壓箱寶了

你還可以使用 Laravel 8 內建的 Faker 套件來生成隨機資料

而且這些生成的資料假的就像真的一樣

實作方法很簡單

先生成 Faker 物件

接著就能夠用它來生成出無數的假資料

比如範例碼的第一行用 Faker 工廠來生成一個 Faker 物件

你還能透過建構子參數來指定假資料的語系

沒錯,和你想的一樣

Faker 支持生成繁體中文假資料

得到 Faker 物件之後

透過它的 name 屬性,你就能得到隨機的名字

透過它的 address 屬性,你就能得到隨機的地址

依此類推

而且每個屬性都支援函式呼叫的版本

用來讓你傳入參數來控制所生成的隨機資料

[換頁]

Faker 所能生成的資料型態非常的多樣

這也是它受歡迎到被內建於 Laravel 框架的原因

我列出幾類供你參考

實際上是遠不止這幾種

像是數字系的 randomDigit

文字系的 word

身份系的 name

網路系的 email

關於 Faker 的更多資訊我會整理在課程資訊裡頭

想瞭解更多的話歡迎進去看看

[換頁]

終於到了這個單元的最後一個小節

我要和你聊聊 Model Factory 機制

在開始說明它的細節之前

我想先和你介紹究竟它能夠為你做什麼

如果你今天的需求只是要為應用生成假資料的話

Model Factory 多半起到重構的作用

讓你的 Seeder 類別的內容更好讀一些

架構看起來更優美一點

並沒有起到殺手級那種關鍵的效益

但如果你打算導入 TDD 開發模式來進行專案開發

需要進行單元測試並因此需要用到假資料的話

Model Factory 將會起到關鍵作用

我現在無意深談這部分細節

只是先讓你知道這個結論

等到單元測試章節再來說這部分知識點

[換頁]

Model Factory 設計出來的基本目的

主要是為了能夠更方便的產生大量資料

所以就把定義欄位的邏輯移進 Factory 類別裡頭

所有的工廠類別檔案存放於 databases/factories 資料夾內

裡頭內建了 Faker 物件並包含了模型各欄位的資料格式定義

比如 users 表格的模型類別名稱就叫做 UserFactory.php

當要利用工廠來生成假資料時只要使用模型的 factory() 就可以了

原先 Seeder 檔案負責包辦業務下單 . 定義產品規格以及製造產品

就像是台灣 30 年前的客廳即工廠的概念

現在 Seeder 則化身成業務員只負責業務下單

其他工作都轉由工廠來負責執行了

[換頁]

要生成工廠類別同樣有 make 系列指令可以代勞

輸入 make:factory 指令並在後面接所要生成的類別名稱

命名慣例為模型名稱加上Factory

比如 UserFactory 負責生成使用者假資料

工廠類別裡頭最重要的函式就是 definition()

裡頭定義了各欄位需要哪一種型態的假資料

工廠物件本身就內建了 faker 屬性可取得 Faker 物件

可以搭配之前介紹的 Faker 屬性與函式來得到各種型態的假資料

你可以參考右邊這張圖的例子

[換頁]

你最需要修改的就是工廠類別 definition 函式內的回傳陣列

確保每個欄位都設定好正確的資料型態

你可以直接把 Seeder 原先的資料定義程式碼複製進來做點調整即可

[換頁]

工廠類別改好之後

接著就要回到原來的 Seeder 檔案現場

把作業機台都拆掉只留下高檔專業的辦公桌

現在你不需要有新增或定義資料的內容

轉而使用模型的 factory() 來生成資料

最後的 create() 表示當假資料生成之後直接寫入資料庫中

因此第一行程式碼將會在資料庫生成一筆假使用者資料

還可以搭配 times() 來指定生成幾筆資料

因此第二行程式碼將會在資料庫生成三筆假使用者資料

[換頁]

因為工廠裡的 Faker 物件是自動生成好的

因此你沒有機會透過建構子來指定語系

好消息是在 8.x 版本時你可以直接在 config/app.php 進行設定

但在 7.x 以前的版本就必須在 AppServiceProvider.php 裡頭

加上這段程式碼才可以

會比較麻煩一些

如果是比較舊的 Laravel 專案就要請你注意一下

[換頁]

這個單元的內容也不少

所以也請你做一些練習來鞏固你的所學

首先請為你的作品網站表格撰寫 Seeder

接著嘗試用 Seeder 來生成假資料

下一步加入一些隨機策略或者是 Faker 來讓資料更隨機一些

最後改成使用 ModelFactory 來改寫 Seeder

[換頁]

在課程結束之前我還想分享 Faker 的一個隱藏功能

就是它能幫你產生網頁所需要的隨機圖片

甚至還可以把這些隨機圖片給下載到你的專案內

壞消息是因為太好用了導致伺服器不堪負荷

現在它只能夠提供內容為文字的圖片

圖片美感大不如前

但是就功能來說是沒有影響的

如果你需要這個功能的話

它的語法我幫你整理在這裡供你參考

[換頁]

上一張投影片的某一個參數讓你可以指定所需要的圖片類型

所以這裡我也幫你整理 Faker 所支援的所有圖片類型

如果你需要這個功能的話

建議你把這張投影片截圖下來

要用的時候就可以進來查詢

[換頁]

這個單元就到這邊 我們下個單元見

掰掰

--------------------

參考資料

Faker 類別說明 https://github.com/fzaninotto/Faker

18分
【 API 開發 】物件關聯資料庫的CRUD

你好,歡迎回到 Laravel 百萬年薪特訓營

之前花了不少時間介紹如何建立表格與假資料

終於到了介紹如何去運用這些資料的單元

我將要告訴你如何優雅地去實作表格的 CRUD 功能

也就是透過 Eloquent 來完成

不需要你自己去寫 SQL 語法

我要教給你的這些技巧每一個都很實用

請你調整好自己的狀況

跟著我一起學會撰寫 CRUD 程式吧

[換頁]

老規矩,為了幫你進入狀況

我還是幫你做個 CRUD 快速入門

但為了避免影片長度過長

我就挑重點講就好

[換頁]

有些人或許不知道什麼是 CRUD

其實它代表的是我們後端工程師最基本必須要會

存取資料庫表格的四個動作

分別是新增 CREATE

查詢 READ

修改 UPDATE

以及刪除 DELETE

取這四個單字的頭,就成了 CRUD

[換頁]

而 CRUD 是有對應到 Restful 的路由規則的

我們在介紹控制器的單元有談過這張表格

如果你對這個表格不熟悉的話

建議你回去重看控制器介紹的單元

這邊只是要提醒你

當實做這七個方法時就要用到 CRUD 技巧

[換頁]

這張投影片只是提醒你 CRUD 對應 RESTful 的懶人包

如何在生成 Controller 之時順便生成 RESTful 方法

以及宣告 CRUD 所需要的路由規則

同樣是在介紹控制器單元有完整說明

這裡只是加深你的印象

[換頁]

之前我們有完整的介紹過什麼是 Restful

它有一個特徵是這個

是一種純粹使用 URL 網址來傳遞資訊的機制

比如 /photos/1/edit

就傳遞了三個訊息

第一 針對 photos 表格做處理

第二 取出主鍵欄位為 1 的資料

第三 開啟編輯該筆資料的頁面

[換頁]

剛剛已經複習過 CRUD 方法與路由規則生成的懶人包

也是我最多使用的做法

但有些情況下你可能需要個別的去宣告路由規則

這裏我也補充說明一下

在路由規則介紹單元我們有提過

在指定某請求要交由哪個控制器的方法來接手

它的格式就是控制器@方法名稱

在 8.x 以上版本控制器名稱前面必須要補上完整命名空間

畫面上顯示的這個語法

你或許看起來有點陌生

但他其實只是一種替代語法把第二參數變成了陣列

這樣就能夠在指定所要負責的控制器方法之餘還為此路由命名

但你仍舊可以用之前在路由規則宣告單元所教的做法去撰寫

不一定要這樣寫

這裡只是讓你了解有這種寫法

陣列的 uses 鍵用來指定控制器方法

而 as 鍵則用於為路由命名

而路由命名慣例上喜歡用資源名.動作的格式

比如這裡的 tasks.store

[換頁]

當我們完成 CRUD 作業之後都會需要做畫面的跳轉

比如當你完成某筆資料變更的動作

就會需要跳轉到該筆資料的顯示頁面或者是表格的總覽頁

如果不這麼做,就會看到畫面一片白色

有時甚至會導致該動作被執行多次

資料變更還算好

當執行資料新增時就會導致新增多筆相同資料

所以請務必記得要做轉址的動作

轉址方法就是用畫面上的這個語法

我們之前在轉址單元就已經介紹過了

[換頁]

首先來介紹該如何新增資料

[換頁]

第一種用 Model 新增資料的方法

就是在建立 Model 類別物件並設定屬性後

去呼叫它的物件方法 save()

這時物件的狀態就會和資料庫同步

達到新增資料的目的

寫法分兩種

一種是畫面左邊這樣用屬性來進行設定

另一種則是畫面右邊這樣用建構子來設定

結果沒什麼不同

你可以根據自己的喜好來選擇

有個小細節要注意

如果你選擇使用屬性來設定的話

在用 new 保留字去生成物件時是可以不需要加上小括號的

像這樣

[換頁]

第二種用 Model 新增資料的方法

這個更為常用

因為你可以從控制器函式所給你的 Request 物件

取出各欄位資料後

接著用 create() 來新增資料

來看畫面的這段程式碼你就明白了

store 方法負責將資料新增到資料庫內

因此該方法會用到 Request 物件

可以從參數列取得

Request 物件的 all() 能得到所有傳入的欄位資料陣列

將欄位資料陣列傳入模型的 create() 完成新增資料動作

[換頁]

接著我有必要談談最困擾新手的一個錯誤

MassAssignment Exception

到底什麼是 MassAssignment?

又為什麼 Laravel 要設計這樣的機制呢?

現在我來解決你的這些困擾

Mass Assignment 照字翻是大量複值

但它指的其實是

你直接把從前端所傳入的資料以陣列直接丟給模型 create() 的行為

像第一種做法雖然也有用到陣列但透過建構子生成就不算

至於 Laravel 設計這個機制的原因

當然就是安全考量

從前端取得傳入資料有很多種做法

其中 all() 是最簡單也最危險的作法

你能得到所有的傳入資料當然也包含別人多加給你的

如果有駭客熟知你的表格結構與程式碼

就能夠透過竄改網址的方式來追加欄位資料

在你不知情的情況下去異動不該被修改的欄位

比如使用者權限

因此 Laravel 在發現你正在做 MassAssignment 時

預設所有欄位都是不可以寫入的

需要你自行告訴它哪些可以寫入

甚至你還可以自己去

關閉某個模型類別的 Mass Assignment

雖然在使用模型的 create() 需要注意大量賦值的問題

但它仍然是很好用的

因為可利用它來快速新增資料

只要注意陣列的鍵與欄位名稱有對應到即可

所以一般我們會讓前端表單的 name 與資料庫表格欄位一致

就可以輕易地利用 create() 來新增資料了

至於 Mass Assignment 的問題你只需要透過白黑名單來解決即可

[換頁]

什麼是白名單,什麼又是黑名單呢?

白名單是指哪些欄位可透過 Mass Assignment 來寫入

黑名單則是相反

剛才有說過 Laravel 預設是把所有欄位都放進黑名單

因此要開放欄位可寫入你就需要把合法的欄位放進白名單中

[換頁]

具體的作法請看這張投影片

我們需要在模型類別裡頭加入保護級的 fillable 屬性

fillable 的內容是陣列

讓你加入可合法被寫入的欄位名稱

如果你懶的逐一列出要放行的欄位

你也可以直接複寫 guarded 屬性

將之設定為空陣列

黑名單為空就意味著不再對此模型進行任何大量賦值保護

寫起來更為方便但也就失去了安全性

假如可以的話

建議你還是以白名單的方式來個別開放比較好

[換頁]

接著來說明如何查詢資料

[換頁]

首先先看該如何查詢單筆資料

只要你有保留每個表格的主鍵欄位

你就能夠使用這幾個方法來找出需要的資料

透過模型的 find() 只要傳入主鍵 id

就能得到對應該主鍵值的資料

如果找不到資料的話就會回傳 null

如果在 find 後面加上 OrFail 後綴的話

就代表當找不到該主鍵資料的話

程式就會直接報錯而不是回傳 null

除了用 find 會得到單筆資料之外

還有一種情況也只會得到單筆資料

那就是在下完查詢條件之後用 first() 來進行時

不管查到幾筆資料最終你只會得到第一筆資料

當然也就符合查詢單筆資料

這三個方法最後回傳給你的一定會是模型物件

你可以直接取用他們的屬性

[換頁]

我知道你剛看到 where()

還不太清楚裡頭的機制

所以這張投影片我想好好的和你聊聊

在 Eloqeunt 世界中的資料查詢之旅

先來看這整段程式碼

我們為 Task 模型去加入 is_feature 欄位須為 true 這限制條件

接著用 orderBy() 來將查詢結果用 created_at 進行從新到舊排序

最終寫上 get() 來完成查詢

然後我們將查到的結果存入名為 tasks 的變數

你應該在網路上見過像這樣的程式碼

但你或許不曉得在這段查詢資料的旅途中

到底發生了什麼

而如果旅途在過程中結束的話

到底 $tasks 又會得到了什麼

在整個資料查詢的旅程當中簡單可分成兩個階段

分別是 SQL 語句建構

以及向資料庫進行查詢

Eloquent 向資料庫進行查詢並沒有什麼黑科技

同樣是透過 SQL 語法

這就是為什麼我花了一些單元向你介紹 SQL 語法的原因

只是你不用自己寫罷了

當你呼叫這個階段的相關函式

比如這個例子中的 where() 和 orderBy()

所得到的回傳內容就會是查詢建構器

或稱為 QueryBuilder

一旦你明白了這點

就能夠做出搭配條件判斷式

透過多行程式碼來完成一個 SQL語法建構的進階用法

而一旦呼叫完 get() 之後

就會結束 SQL 語句建構階段

開始向資料庫進行查詢

而旅途是不可逆的

你只能夠省略 SQL 語句建構階段

代表你是要查詢該表格的所有資料

但你不可以在進行查詢之後回頭去做 SQL 語句建構的動作

因為你得到的已經是資料集合

它們不再具備建構 SQL 語句的能力

了解這些原則將能讓你明白到底 $tasks 變數內的東西是什麼

這能夠對你撰寫查詢程式碼時起到關鍵作用

[換頁]

談完資料查詢之旅我們繼續來看如何查詢多筆資料

當你想要查詢表格的所有資料有兩種方法

第一是透過專有的 all()

第二種則是更為泛用的 get()

雖然 get() 是用來就查詢條件進行查詢

但如果不下任何條件的話不就等於查詢表格的所有資料嗎

所以我個人更偏愛使用 get() 來進行全表查詢

當你需要加入限制條件時

最常用的肯定就是 where()

where() 最常用的是兩個參數的版本

第一個參數是要查詢的欄位名稱

第二個參數則是該欄位所要限定的值為何

條件為相等

如果你想比較的並非相等而是其他比如大於或小於

就可以改寫成 三個參數的版本

這個時候第二個參數就變成比較運算子

第三個參數才是該欄位所要限定的值為何

有需要你在網路上可以找到更多的內容

另外 where() 並非只能寫一個

你當然可以組合多個 where() 來達到交集的過濾條件

也就是 SQL 語法中的 AND

當條件下完之後別忘了補上 get() 來進行查詢

你還可以在 get() 之前搭配 orderBy() 來進行資料排序

第一參數為排序的依據欄位

第二參數則是從大到小還是從小到大

比如這個例子中是根據 created_at 欄位,從大到小排序

更口語化的說就是從新排到舊

有個原則請你一定記起來

當你使用 get() 或 all() 這種有可能得到多筆資料的查詢方式

不管最終結果是一筆或多筆資料

只要有可能是多筆資料

你得到的必然是物件集合,你需要先取出資料物件後才可以去取欄位資料唷

[換頁]

這個頁面我幫你整理出一些可以使用的限制方法

where() 剛才介紹過

orWhere() 則是讓你組合出聯集的條件語法

也就是 SQL 中的 OR

whereBetween 適合針對欄位內容為數值的過濾條件

比如使用者年紀介於 18 到 35 歲之間就很好用

whereIn 讓你比對欄位資料需為條件陣列中的某一個

比如限定使用者住在台北或新北市就能用這個

whereNull 與 whereNotNull 比對某欄位是否為空值

如果你偏愛直接寫 SQL 語法

那 whereRaw 就是你在找的方法

distinct 函式就跟同名的 SQL 語法相同用法

[換頁]

這一頁我幫你整理出查詢的修改方法

orderBy() 剛才介紹過,用來做資料排序

groupBy() 與 having() 多用於資料分析與統計

讓你能根據欄位名稱來進行分群再針對這些群組設定搜尋條件

skip() 設定要跳過多少筆資料

take() 則決定要回傳幾筆資料

這兩個函數組合在一起就能做出分頁功能

latest() 和 oldest() 用來做時間排序,和 orderBy() 差不多

我個人都用 orderBy 來做

最後的 inRandomOrder() 可以隨機排序結果

做賓果遊戲可能會比較好用

[換頁]

之前課程有人問過我該如何使用 groupBy() 和 having() 來做分群查詢

所以我補了這張投影片給你們參考

但我必須說明分群查詢是比較資深的工程師要做分析報表才會使用的技巧

當你還在入門階段搞不太懂也不需要太過在意

之後有用到再回來看即可

如果你連分群的 SQL 語法都看不懂

那這個投影片你可以先跳過

select() 能讓你去指定要取得哪些欄位

和 SQL 語法一樣

如果你用的是 Eloquent 模型類別

需要先呼叫 getQuery() 來取得底層查詢建構器

如果你想直接撰寫原生 SQL 語法可以搭配 raw()

還有一個 havingRaw() 能讓你撰寫原生的 having 語法

[換頁]

這邊我同樣幫你整理出所有的進行資料庫查詢語法

它們多半會串在查詢程式碼的最後

get() 剛說過,最泛用的一個,一定要記起來

all() 取得所有資料,沒 get() 好用

first() 和 firstOrFail() 取得第一筆資料

find() 和 findOrFail() 用主鍵來進行查詢

value() 只從第一列的指定欄位取值

我很少用到

min() 與 max() 用來回傳特定欄位的最小或最大值

sum() 回傳特定欄位所有值的總和

avg() 回傳特定欄位所有值的平均值

with() 同時回傳所參考的資料

這個如果不懂關聯的話就不太好懂

等到表格間關聯的查詢章節再來好好說明

[換頁]

接下來談談該怎麼修改與刪除資料

[換頁]

一般在修改資料時

最常見的情境就是從 request 物件取得欄位資料後

接著用 Model 物件的 save() 來進行同步更新

比如這段範例碼

先用主鍵欄位 id 搭配 find() 來找出資料後

設定該資料的 is_feature 欄位的值為前端所傳入的同名輸入項的值

這時只是改變模型物件的值

實際資料庫沒有任何變化

但是當你呼叫該模型物件的 save() 之後

就會啟動 Active Record 的第三個特性

物件可管理自己的持久保存

白話說就是這時資料庫資料的狀態就會和物件屬性完成同步

最終達到變更資料的目的

[換頁]

這裡順便補充一個組合技給你

之前在路由定義單元有介紹過 Route Model Binding

它能讓你少寫一個用主鍵來進行查詢的程式碼

因此在這時你不論是用在修改資料或者是等會要說的刪除資料

都極為好用

實際上預設懶人包所生成的 CRUD 方法

都是使用這樣的組合技的

雖然並非必要,但我很推薦你把這個技巧給學起來

如果還是不熟 Route Model Binding

請你回到路由定義章節去再看一次

[換頁]

當你要刪除資料時有兩種方式

這裡先介紹當你已經取得該資料的模型物件時

你可以直接呼叫該物件的 delete() 來進行刪除

就如同這段範例這樣

直接用 Route Model Binding 取得該資料物件後

呼叫 delete() 完成資料刪除

刪除完之後別忘了轉址到其他路由以免畫面是一片白色

[換頁]

假如你沒有該資料的物件

但是有一個或多個主鍵的id

你還是可以利用 Model 模型類別的 destroy() 來進行刪除

就像是畫面上這樣

[換頁]

這個單元的內容與知識點都非常的多

我已經盡量濃縮精華觀念給你了

我建議你至少看個兩次以上來掌握這些觀念

並一定要多加練習才有辦法靈活運用

請你花一點時間來完成這些作業

1.為你的作品網站生成對應 Controller,並生成 RESTful 資源函式

2.試看看將所有函式改成支援 Route Model Binding 的寫法

3.為資源函式加入 CRUD 的實作程式

4.確保模型類別有加入 fillable 屬性,並開放除 id 外所有欄位通過 Mass Assignment 機制

5.為 web.php 加入測試路由來測試 CRUD 能否正常執行

[換頁]

你已經堅持到這裡了 表示你非常的棒

再接再厲 很快你就會完成 Laravel 入門了

我們下個單元見 掰掰

23分
【 Laravel 】用 Model 來處理資料與邏輯
14分
【 API 開發 】請求資料驗證
11分
22分
【 Laravel 】用 Eloquent Relationship來帶出其他表格的資料

你好,歡迎回到 Laravel 百萬年薪特訓營

這個單元我想教你如何更輕鬆取得跨表格的關聯資料

透過 Eloquent Relationship

[換頁]

為了方便你理解

我將用派工網站應用來作為範例

這個應用的表格關係就如同這張圖這樣

cgies 表格為工作分類

tasks 表格為工作

users 表格為使用者

每個工作屬於一個工作分類

這邊標示 1 屬於 1

每個工作分類擁有多個工作

這邊標示 1 擁有 n

接下來每個使用者可以有多份工作

這邊標示 1 擁有 n

另一邊每個工作也屬於多個使用者

同樣標示 1 屬於 n

當兩邊都是一對多的情況下時就會升級為多對多的關係

需要另外準備一個表格來儲存多對多關係

這個表格就是黃色的 task_user

[換頁]

首先從一對一關係開始說起

[換頁]

在派工網站應用當中屬於一對一關係的

就是工作和工作分類之間的關係

因為每個工作都屬於某一個工作分類

這時外鍵欄位就會設計在一對一關係的視角方

也就是工作表格 tasks

這裡新增了一個名為 cgy_id 的欄位

旁邊標注了 fk 表示為 Foreign Key 也就是外鍵

cgy_id 取名於參考表格類別名稱 cgy 加 _id

若不照此命名規則將需要額外說明外鍵欄位名稱

[換頁]

那一對一關係該如何設定呢

簡單可以分為三個步驟

步驟一 調整 Migration 與表格

步驟二 撰寫 Model 關係函式

步驟三 測試 Model 關係函式

我們就來看看各步驟該怎麼做

[換頁]

在步驟一時

你需要在 up() 設置外鍵關係

並且在 down() 去移除外鍵關係

從 7.x 開始有了更方便的語法

可以同時完成新增外鍵欄位並設置外鍵關係雙動作

就是畫面左邊的這段桃色程式碼

cgy_id 就是我們要新增的外鍵名稱

移除外鍵關係則是畫面右邊的桃色程式碼

將外鍵欄位傳入 dropForeign 函式內

如果你需要把舊 Laravel 專案做升級的話

請特別注意新版本的主鍵型別已升級為 BigInteger

因此外鍵型別也需要是 BigInteger 才可以喔

否則會出現 Foreign key constraint is incorrect formed 錯誤

[換頁]

步驟二要來撰寫 Model 關係函式了

有四件事情你需要注意

第一 函式的命名最好是對應的 Model 名稱

比如工作對應工作分類的名稱為 Cgy

函式名稱就叫做 cgy

第二 belongsTo() 代表屬於誰的關係

第三 hasOne() 代表有一個的關係

究竟要使用哪一個可使用語意分析的技巧

也就是用唸的看看哪一個比較合理

像是工作與分類的這個例子

工作屬於某一個分類還是工作擁有某一個分類

答案就是前者所以會使用 belongsTo

第四 所傳入的參數為對應到哪一個 Model

在例子中就是工作分類 Cgy

了解這四件事情之後你就可以在 Task 模型中宣告關係函式

也就是畫面下方的這段程式碼

別忘了需要把結果給回傳出去喔

[換頁]

步驟三要來測試看看關係函式是否有效了

有兩種做法可以來取用

分別是函式以及魔法屬性

這兩種作法的使用時機不太一樣

初學者一定要把它們搞清楚才能夠靈活運用

函式用於希望能夠做更多的查詢或處理時

所得到的內容為查詢建構器

程式碼可以看到有加上一對小括號

魔法屬性則用於執行關聯查詢

所得到的內容為 Model 物件

這時我們就不需要在關係函式名稱後面加上小括號

[換頁]

如果你需要把工作所屬的分類由A轉到B

這張投影片就是你需要的

你可以在關係函式 cgy() 後面再串上 associate()

並傳入新的分類物件

最後呼叫 save() 完成資料庫同步

假如你需要的是打斷工作與任何分類的關係

就將 associate() 更換為 dissociate()

但這個較為少用

畢竟外鍵欄位很少會有支援為空的狀況

[換頁]

以上就是一對一關係的重點內容

接下來看看一對多關係

[換頁]

一對多關係在派工網站應用中指的就是

每個分類都有多個工作

用到的表格和剛才一對一完全相同

不需要針對表格做任何額外變更

關鍵依然是確保工作表格內有外鍵欄位

[換頁]

看到一對多關係設定時

是不是感到有種熟悉感

沒錯 一對多和一對一的流程完全相同

讓我們繼續看下去

[換頁]

在編輯 Migration 檔案的這個步驟

和一對一所寫的程式語法完全相同

假如之前一對一的動作有完成的話

這個步驟就可以直接省略

[換頁]

在步驟二撰寫模型的關係函式時有了小小的不同

第一 命名時最好是對應 Model 名稱的複數型

比如本例中分類對應到工作 Task

因此關係函式就會取名為 tasks

第二 belongsTo() 同樣代表屬於誰的關係

第三 hasMany() 代表有很多個的關係

第四 參數同樣還是傳入所對應的模型類別

因此本例中,我們在 Cgy 模型中加入以下的程式碼

呼叫實例的 hasMany 函式

傳入 Task 類別後回傳

[換頁]

完成關係函式的宣告後

這裡我來說明一下該如何使用

之前在一對一有談過使用上有分成函式和魔法屬性兩種

各有不同的使用情境

這點在一對多還有後面會談到的多對多都一樣

因此在這張投影片你可以觀察到

tasks 有些有小括號有些則沒有

第一種情境你想要取出某分類的所有工作

可以在分類物件後面接 tasks 魔法屬性

你將會得到內容為工作物件的集合

第二種情境你想要為分類加上一個新工作

可以在分類物件後面接 tasks 方法後再接 save()

傳入新工作的物件就可以囉

第三種情境如果想要為分類加上多個新工作

可以將 save() 替換為 saveMany()

傳入包含所有新工作物件的陣列即可

[換頁]

以上就是一對多的所有重點

你應該可以發現當完成一對一的關係宣告之後

其實一對多的功能也就完成一大半了

但接下來多對多的關係就比較複雜一些了

要掌握的重點也就更多

建議你可以先暫停一下幫自己倒杯水或咖啡

準備好筆記本以及良好的精神來學習本單元最後的重點

多對多關係

[換頁]

在範例中的多對多關係指的是

每個使用者有多筆工作,每個工作也有多個使用者

兩邊都是一對多,所以升級成多對多關係

在這情況下需要新增一個 pivot 表格

在表格裡頭設計兩個對應表格的外鍵

就是這裡的 user_id 和 task_id

完全按照命名規則慣例

[換頁]

多對多關係的設定多了一個步驟

因為新增了一個中介表格的關係

還需要去建立它的模型類別

[換頁]

在步驟一需要去加入一個新的 Migration 檔案

目的是建立 pivot 中介表格

表格命名規則是使用兩個表格的模型名稱

中間用下橫線來連結是按照蛇底式命名法

至於哪一個模型名稱在前面就按照首字母來判斷

從 A 到 Z 較小的放前面

因此預設命名就會是 task_user

在 up 函式中去加入兩個表格的外鍵欄位與關係宣告

在 down 函式中確保在刪除表格前先移除關係宣告

[換頁]

多數狀況下你也有必要為中介表格建立模型類別

利用 make:model 指令來生成

但記得需要把繼承的類別改為 Pivot

否則會出現找不到表格的錯誤

[換頁]

步驟三撰寫關係函式時同樣有4件事要注意

第一 有需要的話,關係函式可在兩個表格模型上宣告

在範例中指的就是 tasks() 和 users()

第二 belongsToMany() 代表屬於哪些的關係

第三 如果希望在中介表格去紀錄多對多關係建立的時間

可在後面再串 withTimestamps()

這樣中介表格的 created_at 和 updated_at 才會被維護

第四 傳入參數依然為對應到哪一個 Model 的類別

最終我們就宣告出底下的這兩段關係函式

[換頁]

現在來說說該如何去使用多對多關係函式

第一段範例碼示範要取得某用戶的所有工作

可透過用戶的魔法屬性 tasks

第二段範例碼示範反過來要取得某工作所屬的所有用戶

可透過工作的魔法屬性 users

第三段範例則是演示該如何為用戶加入新工作

有 save() 和 attach() 兩種方式

差異在於 save() 是傳入新工作物件

而 attach() 則只需要傳入新工作的主鍵 ID

如需一次新增多筆

save() 可替換為 saveMany()

attach() 則只需要把參數改為陣列即可

[換頁]

假如需要把用戶的某項工作移除該怎麼做呢

答案就是在關係函式後面串 detach()

傳入所要移除工作的主鍵 ID

就如同第一段範例碼的寫法

這比較適合用於單個關聯的調整

假如需要大量改動該用戶的工作

這時候可以考慮使用 sync()

這個方法可以清除用戶原先的所有工作

再重新建立工作

在第二段範例碼中

10號用戶的工作將重新分配為 1,3,5,7,9 號工作

[換頁]

有個小技巧在做電商網站時會用到

中介表格其實可以加入更多額外欄位

除了在 Migration 檔案加入額外欄位外

需要你在宣告關係函式時加入 withPivot()

目的是讓 Laravel 知道在關聯查詢時一併取出該欄位的資料

這樣的話之後需要取得額外欄位

就可以透過右側的範例程式碼

也就是透過 pivot 屬性去取你的額外屬性

同樣也包括 created_at 時間戳記欄位

[換頁]

這張投影片對新手來說就不是太重要了

這只對於不喜歡用 pivot 屬性而想要改其他名稱才有用

在這段範例的最後串上了 as() 並傳入了 detail

之後要取用額外屬性就不是透過 pivot 屬性而是 detail

[換頁]

最後我想要補充幾個進階技巧讓你知道

如果你希望在變更關係時連帶的更新父紀錄可以透過 touches 屬性

我知道這樣說你不太好理解

還是用這段範例碼來說明好了

當在 Task 模型加上 touches 屬性之後

當你變更某個工作的分類之後

除了該工作的 updated_at 會更新之外

該工作所指向分類的 updated_at 也會跟著更新

這裡的父紀錄就是所指向的新分類

[換頁]

預設情況下,Laravel 在處理關聯資料是採取懶惰載入

意思類似在查詢某用戶的資料時不會主動帶出他對應的工作資料

從而避免不必要的查詢浪費以提升效率

但如果你希望它主動為你帶出關聯表格的資料

這個技巧就是 Eager Loading 積極性載入

聽起來有點複雜但做起來卻很簡單

你只需要在查詢時多串一個 with() 裡頭傳入關係函式名稱

它就會在這次查詢時啟動積極性載入

你可以參考第二行範例碼的做法

如果你不想要得到完整資料

想要的是關聯資料的筆數則可以替換為 withCount()

如同第三行範例碼的做法

[換頁]

有很多初學者在學習表格關聯時

容易搞混在使用關係函式時到底要不要加上小括號

如果你也有這樣的問題

我的答案是要看你的目的為何

如果你想要的是進行查詢取得資料物件就不用加

反之,假如你還要進行進階查詢或者做資料變更就需要加

假如你還是搞不懂我在說什麼

最好的辦法請你兩種都試看看

然後把傳回的內容用 dd() 印出來

觀察看看兩者的不同相信就能釐清你的問題了

[換頁]

這個單元的知識點較多而且實用

請你花點時間做個練習

完成之後再繼續下個單元的學習

請為你的作品網站表格建立 Eloquent Relationship

必須包含一對一 . 一對多以及多對多這三種關係

這裡是一個電子商務網站的例子供你參考

宣告好之後也要測試看看能否查詢關聯資料且新增

[換頁]

這個單元就到這邊

別忘了要練習,我們下個單元見,掰掰

20分
【 API 開發 】CRUD 的 API 實作示範
19分
【 API 開發 】CRUD 的 API 規劃範例
mb
【作業】CRUD API 專案實作練習
mb
試看看加上一個前端來使用API
mb
【 API 開發 】透過 JWT 來確認API權限
4分
【 API 開發 】JWT 實作示範
17分
【作業】API 導入 JWT 實作練習
mb
請求的生命週期
mb
淺談 CSRF 防護機制
mb
中介層 Middleware 快速入門
mb
Facade全攻略
mb
資料表的軟刪除運用
mb
Contract 合約全攻略
mb
用 Session 來將資料存在伺服器端
mb
【 套件 】用 Flash Message 來傳遞訊息
mb
如何撰寫自己的Artisan命令
mb
日誌 Log 全攻略
mb
【 套件 】本地化支持
mb
Restful API 設計要點
13分
限定請求次數
mb
CORS
快取機制

課程筆記 https://pandalab.org/articles/180

循序漸進理解 HTTP Cache 機制 https://blog.techbridge.cc/2017/06/17/cache-introduction/

讓網站速度飛快的秘密,你了解什麼是網頁快取嗎? https://progressbar.tw/posts/93