<article><h1>Laravel 數據庫之:數據填充</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#writing-seeders">編寫 Seeders</a><ul><li><a href="#using-model-factories">使用模型工廠</a></li><li><a href="#calling-additional-seeders">調用其他 Seeders</a></li></ul></li><li><a href="#running-seeders">運行 Seeders</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p>Laravel 可以用 seed 類輕松地為數據庫填充測試數據。所有的 seed 類都存放在 <code class=" language-php">database<span class="token operator">/</span>seeds</code> 目錄下。你可以任意為 seed 類命名,但是應該遵守類似 <code class=" language-php">UsersTableSeeder</code> 的命名規范。Laravel 默認定義了一個 <code class=" language-php">DatabaseSeeder</code> 類。可以在這個類中使用 <code class=" language-php">call</code> 方法來運行其它的 seed 類來控制數據填充的順序。</p><p><a name="writing-seeders"></a></p><h2><a href="#writing-seeders">編寫 Seeders</a></h2><p>可以通過運行 <code class=" language-php">make<span class="token punctuation">:</span>seeder</code> <a href="/docs/5.4/artisan">Artisan 命令</a> 來生成一個 Seeder。所有由框架生成的 seeders 都將被放置在 <code class=" language-php">database<span class="token operator">/</span>seeds</code> 目錄下:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>seeder UsersTableSeeder</code></pre><p>一個 seeder 類只包含一個默認方法:<code class=" language-php">run</code>。這個方法在 <code class=" language-php">db<span class="token punctuation">:</span>seed</code> <a href="/docs/5.4/artisan">Artisan 命令</a> 被調用時執行。在 <code class=" language-php">run</code> 方法里你可以為數據庫添加任何數據。你也可以用 <a href="/docs/5.4/queries">查詢語句構造器</a> 或 <a href="/docs/5.4/database-testing#writing-factories">Eloquent 模型工廠</a> 來手動添加數據。</p><p>如下所示,我們來修改默認的 <code class=" language-php">DatabaseSeeder</code> 類并為 <code class=" language-php">run</code> 方法添加一條數據庫插入語句:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Seeder</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Model</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">DatabaseSeeder</span> <span class="token keyword">extends</span> <span class="token class-name">Seeder</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* 運行數據庫填充
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token scope">DB<span class="token punctuation">::</span></span><span class="token function">table<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">insert<span class="token punctuation">(</span></span><span class="token punctuation">[</span>
<span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">str_random<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">str_random<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token string">'@gmail.com'</span><span class="token punctuation">,</span>
<span class="token string">'password'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">bcrypt<span class="token punctuation">(</span></span><span class="token string">'secret'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="using-model-factories"></a></p><h3>使用模型工廠</h3><p>當然,手動為每個模型填充指定屬性很麻煩。作為替代方案,你可以使用 <a href="/docs/5.4/database-testing#writing-factories">模型工廠</a> 來輕松地生成大量數據庫記錄。首先,閱讀 <a href="/docs/5.4/database-testing#writing-factories">模型工廠文檔</a> 來學習如何定義工廠。一旦定義了工廠,就可以使用 <code class=" language-php">factory</code> 這個輔助函數來向數據庫中添加記錄。</p><p>如下所示,我們來創建 50 個用戶并為每個用戶創建關聯:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 運行數據庫填充
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">factory<span class="token punctuation">(</span></span><span class="token scope">App<span class="token punctuation">\</span>User<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">create<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">each<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$u</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$u</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">posts<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">save<span class="token punctuation">(</span></span><span class="token function">factory<span class="token punctuation">(</span></span><span class="token scope">App<span class="token punctuation">\</span>Post<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="calling-additional-seeders"></a></p><h3>調用其他 Seeders</h3><p>在 <code class=" language-php">DatabaseSeeder</code> 類中,你可以使用 <code class=" language-php">call</code> 方法來運行其他的 seed 類。為避免單個 seeder 類過大,可使用 <code class=" language-php">call</code> 方法將數據填充拆分成多個文件。只需簡單傳遞要運行的 seeder 類名稱即可:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 運行數據庫填充
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">call<span class="token punctuation">(</span></span><span class="token scope">UsersTableSeeder<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">call<span class="token punctuation">(</span></span><span class="token scope">PostsTableSeeder<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">call<span class="token punctuation">(</span></span><span class="token scope">CommentsTableSeeder<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="running-seeders"></a></p><h2><a href="#running-seeders">運行 Seeders</a></h2><p>一旦完成了 seeder 類的編寫,就可以使用 <code class=" language-php">db<span class="token punctuation">:</span>seed</code> 這個 Artisan 命令來填充數據庫。在默認情況下,<code class=" language-php">db<span class="token punctuation">:</span>seed</code> 命令將運行可以用來調用其他填充類的 <code class=" language-php">DatabaseSeeder</code> 類。但是可以用 <code class=" language-php"><span class="token operator">--</span><span class="token keyword">class</span></code> 選項來單獨運行一個特定的 seeder 類:</p><pre class=" language-php"><code class=" language-php">php artisan db<span class="token punctuation">:</span>seed
php artisan db<span class="token punctuation">:</span>seed <span class="token operator">--</span><span class="token keyword">class</span><span class="token operator">=</span>UsersTableSeeder</code></pre><p>也可以使用會先回滾再重新運行所有遷移的 <code class=" language-php">migrate<span class="token punctuation">:</span>refresh</code> 命令來填充數據庫。這個命令在徹底重構數據庫時非常有用:</p><pre class=" language-php"><code class=" language-php">php artisan migrate<span class="token punctuation">:</span>refresh <span class="token operator">--</span>seed</code></pre><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="https://github.com/houfei">@houfei</a></td><td><img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/3472_1452945992.jpeg?imageView2/1/w/100/h/100"></td><td>翻譯</td><td>玩咖啡 & 鏟屎奴 & 努力回頭做碼農 <a href="https://github.com/houfei">@houfei</a> at Github</td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度