重慶諾懷軟件有限公司 軟件開發(fā), app開發(fā), 微信開發(fā), 小程序開發(fā) - Laravel http://www.smt18.com/blogtag/laravel zh-hans Laravel學(xué)習(xí)筆記(六)數(shù)據(jù)庫(kù)填充 http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%85%AD%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A1%AB%E5%85%85 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用程序往往需要預(yù)先填充數(shù)據(jù)到數(shù)據(jù)庫(kù),以便進(jìn)行測(cè)試和演示。</p> <p>?</p> <h3><strong>什么是種子數(shù)據(jù)</strong></h3> <p>?</p> <p>種子數(shù)據(jù)就是必須要加載了應(yīng)用程序才能正常運(yùn)行的數(shù)據(jù)。大多數(shù)應(yīng)用程序需要在開發(fā)、測(cè)試和生產(chǎn)中加載一些參考數(shù)據(jù)。</p> <p>一般來(lái)說,這些數(shù)據(jù)不是用戶創(chuàng)建的,盡管我們可能一次一次的修改它們;我們的數(shù)據(jù)會(huì)依賴這些數(shù)據(jù)。</p> <p>種子數(shù)據(jù)通常是不變的。一般來(lái)說,在應(yīng)用程序中不可被編輯。但是,要求上它是可以被更改的,如果被更改了,種子數(shù)據(jù)需要被重新加載到部署的應(yīng)用程序中。</p> <p>理想的解決方案是自動(dòng)化的:你沒必要去關(guān)心它。當(dāng)你簽出代碼,啟動(dòng)你的應(yīng)用,他就準(zhǔn)備好了。它應(yīng)該提供數(shù)據(jù)完整性:創(chuàng)建的記錄應(yīng)通過您的驗(yàn)證。它應(yīng)該很容易更新種子數(shù)據(jù)。</p> <p>?</p> <h3><strong>數(shù)據(jù)庫(kù)填充與遷移</strong></h3> <p>?</p> <p>在前幾節(jié)我們講到了數(shù)據(jù)遷移,數(shù)據(jù)遷移可以創(chuàng)建數(shù)據(jù)表的結(jié)構(gòu),其實(shí),數(shù)據(jù)遷移也同樣可以插入數(shù)據(jù),需要?jiǎng)?chuàng)建一個(gè)新的遷移文件:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:make seed_authors_table </pre> </div> <p>運(yùn)行如下:</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121541314306742.png" style="border:0px" /></p> <p>編輯新生成的文件2014_03_12_063755_seed_authors_table.php,</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> &lt;?php <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Schema\Blueprint; <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Migrations\Migration; <span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 0, 255)">class</span> SeedAuthorsTable <span style="color:rgb(0, 0, 255)">extends</span> Migration { <span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(0, 128, 0)"> * Run the migrations. </span><span style="color:rgb(0, 128, 128)"> 9</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> up() <span style="color:rgb(0, 128, 128)">13</span> { <span style="color:rgb(0, 128, 128)">14</span> DB::table('authors')-&gt;insert( <span style="color:rgb(0, 128, 128)">15</span> <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)">16</span> <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)">17</span> 'name' =&gt; 'Bowen', <span style="color:rgb(0, 128, 128)">18</span> 'age' =&gt; 25, <span style="color:rgb(0, 128, 128)">19</span> 'active'=&gt; 1, <span style="color:rgb(0, 128, 128)">20</span> 'email'=&gt;'bowen@nova.com', <span style="color:rgb(0, 128, 128)">21</span> 'bio' =&gt; '', <span style="color:rgb(0, 128, 128)">22</span> 'role_id' =&gt; 2 <span style="color:rgb(0, 128, 128)">23</span> ), <span style="color:rgb(0, 128, 128)">24</span> <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)">25</span> 'name' =&gt; 'Judith', <span style="color:rgb(0, 128, 128)">26</span> 'age' =&gt; 21, <span style="color:rgb(0, 128, 128)">27</span> 'active'=&gt;0, <span style="color:rgb(0, 128, 128)">28</span> 'email'=&gt;'judith@nova.com', <span style="color:rgb(0, 128, 128)">29</span> 'bio' =&gt; '', <span style="color:rgb(0, 128, 128)">30</span> 'role_id' =&gt; 1 <span style="color:rgb(0, 128, 128)">31</span> ) <span style="color:rgb(0, 128, 128)">32</span> )); <span style="color:rgb(0, 128, 128)">33</span> } <span style="color:rgb(0, 128, 128)">34</span> <span style="color:rgb(0, 128, 128)">35</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)">36</span> <span style="color:rgb(0, 128, 0)"> * Reverse the migrations. </span><span style="color:rgb(0, 128, 128)">37</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">38</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">39</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">40</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> down() <span style="color:rgb(0, 128, 128)">41</span> { <span style="color:rgb(0, 128, 128)">42</span> DB::table('authors')-&gt;delete(); <span style="color:rgb(0, 128, 128)">43</span> } <span style="color:rgb(0, 128, 128)">44</span> }</pre> </div> <p>運(yùn)行該遷移文件如下:</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121542372548664.png" style="border:0px" /></p> <p>查看數(shù)據(jù)庫(kù)”authors”表,發(fā)現(xiàn)多了兩條數(shù)據(jù):</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121542459452443.png" style="border:0px" /></p> <h3>?</h3> <h3><strong>數(shù)據(jù)庫(kù)遷移填充的壞處</strong></h3> <p>?</p> <p>雖然我們可以使用數(shù)據(jù)庫(kù)遷移的方式進(jìn)行填充,但是這種方式有很多的缺點(diǎn):</p> <ul><li>如果執(zhí)行了遷移的回滾操作,那么我們添加的數(shù)據(jù)將會(huì)丟失;</li> <li>更改數(shù)據(jù)比較麻煩</li> </ul><p>?</p> <h3><strong>Laravel數(shù)據(jù)庫(kù)填充(Seeder)</strong></h3> <p>?</p> <p>從4開始,artisan現(xiàn)在提供了一種巧妙的方式填充數(shù)據(jù)庫(kù)。遷移永遠(yuǎn)不應(yīng)該被應(yīng)用于填充數(shù)據(jù)庫(kù)。數(shù)據(jù)填充使用artisan db:seed命令,來(lái)非常簡(jiǎn)單的完成填充操作。</p> <p>這個(gè)簡(jiǎn)單的方式通過填充類使用測(cè)試數(shù)據(jù)填充您的數(shù)據(jù)庫(kù)。所有的填充類都存放在app/database/seeds?目錄下。填充類可以以形式命名,但最好遵循一些合理的約束,比如?UserTableSeeder等。默認(rèn)情況下,一個(gè)?DatabaseSeeder?類以為您定義。在這個(gè)類中,您可以使用?call?函數(shù)運(yùn)行其他填充類,允許您控制填充順序。</p> <p>?</p> <h3><strong>創(chuàng)建新的填充文件</strong></h3> <p>?</p> <p>要給”authors”表填充數(shù)據(jù),在app/database/seeds?目錄下創(chuàng)建新的文件AuthorTableSeeder.php,編輯該文件:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> &lt;?php <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 0, 255)">class</span> AuthorTableSeeder <span style="color:rgb(0, 0, 255)">extends</span> Seeder { <span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> run() <span style="color:rgb(0, 128, 128)"> 5</span> { <span style="color:rgb(0, 128, 128)"> 6</span> Author::create(<span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)"> 7</span> 'name' =&gt; 'Test1', <span style="color:rgb(0, 128, 128)"> 8</span> 'age' =&gt; 25, <span style="color:rgb(0, 128, 128)"> 9</span> 'active'=&gt; 1, <span style="color:rgb(0, 128, 128)">10</span> 'email'=&gt;'test1@nova.com', <span style="color:rgb(0, 128, 128)">11</span> 'bio' =&gt; '', <span style="color:rgb(0, 128, 128)">12</span> 'role_id' =&gt; 2 <span style="color:rgb(0, 128, 128)">13</span> )); <span style="color:rgb(0, 128, 128)">14</span> } <span style="color:rgb(0, 128, 128)">15</span> }</pre> </div> <p>然后執(zhí)行artisan命令行:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan db:seed --<span style="color:rgb(0, 0, 255)">class</span>=AuthorTableSeeder</pre> </div> <p>?</p> <p>然后數(shù)據(jù)庫(kù)中就會(huì)新加入一條記錄。</p> <p>還有一種全局的執(zhí)行方法php artisan db:seed,可以執(zhí)行多個(gè)填充類。該方法是執(zhí)行的DatabaseSeeder這個(gè)類,我們編輯這個(gè)類:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> <span style="color:rgb(0, 0, 255)">class</span> DatabaseSeeder <span style="color:rgb(0, 0, 255)">extends</span> Seeder { <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(0, 128, 0)"> * Run the database seeds. </span><span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> run() <span style="color:rgb(0, 128, 128)"> 9</span> { <span style="color:rgb(0, 128, 128)">10</span> Eloquent::unguard(); <span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;call('AuthorTableSeeder'); <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)">調(diào)用'AuthorTableSeeder'填充類</span> <span style="color:rgb(0, 128, 128)">13</span> <span style="color:rgb(0, 128, 128)">14</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;command-&gt;info('Employee table seeded!'); <span style="color:rgb(0, 128, 128)">15</span> } <span style="color:rgb(0, 128, 128)">16</span> <span style="color:rgb(0, 128, 128)">17</span> }</pre> </div> <p>您也可以使用?migrate:refresh?命令填充數(shù)據(jù)庫(kù),將會(huì)回滾并重新運(yùn)行所有遷移:然后執(zhí)行php artisan db:seed,這時(shí)同樣會(huì)成功添加數(shù)據(jù)。</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:refresh --seed</pre> </div> <p>?</p> <p>參考資料:<a href="http://laravelbook.com/laravel-database-seeding">http://laravelbook.com/laravel-database-seeding</a></p> <p>作者更多博客:<a href="http://www.cnblogs.com/huangbx/">Bowen Huang</a></p> <p>未完待續(xù)……</p> <p>?</p> </div></div></div><div id="comment-wrapper-nid-553"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 03:05:18 +0000 Bowen Huang 553 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%85%AD%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A1%AB%E5%85%85#comments Laravel學(xué)習(xí)筆記(五)創(chuàng)建數(shù)據(jù)結(jié)構(gòu),更新數(shù)據(jù)結(jié)構(gòu) http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%94%EF%BC%89%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><h2><strong>默認(rèn)假設(shè)</strong></h2> <p>?</p> <p>所有的列在定義的時(shí)候都有默認(rèn)的假設(shè),你可以根據(jù)需要重寫。</p> <ul><li>Laravel假定每個(gè)表都有一個(gè)數(shù)值型的主鍵(通常命名為”id”),確保新加入的每一行都是唯一的。Laravel只有在每個(gè)表都有數(shù)值型主鍵時(shí)才會(huì)正常運(yùn)行。所以,對(duì)于每一個(gè)Laravel應(yīng)用,都要確保定義的主鍵使用的是increments()方法。</li> <li>列在默認(rèn)情況下為NOT NULL。</li> </ul><p>現(xiàn)在,讓我們一行行分析結(jié)構(gòu)生成器生成的authors表,下面是up()方法中的代碼:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)"> auto increment id (primary key)</span> <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;increments('id'); <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">string</span>('name'); <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">integer</span>('age')-&gt;nullable(); <span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">boolean</span>('active')-&gt;<span style="color:rgb(0, 0, 255)">default</span>(1); <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">integer</span>('role_id')-&gt;unsigned(); <span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;text('bio'); <span style="color:rgb(0, 128, 128)"> 9</span> <span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)"> created_at, updated_at DATETIME</span> <span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;timestamps();</pre> </div> <p>實(shí)際上生成的SQL代碼為:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width:100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> `id` <span style="color:rgb(0, 0, 255)">INT</span>(<strong>11</strong>) <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> AUTO_INCREMENT, <span style="color:rgb(0, 128, 128)">2</span> `name` <span style="color:rgb(0, 0, 255)">VARCHAR</span>(<strong>255</strong>) <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)">3</span> `age` <span style="color:rgb(0, 0, 255)">INT</span>(<strong>11</strong>) <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)">4</span> `active` <span style="color:rgb(0, 0, 255)">TINYINT</span>(<strong>4</strong>) <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">1</span><span style="color:rgb(255, 0, 0)">'</span>, <span style="color:rgb(0, 128, 128)">5</span> `role_id` <span style="color:rgb(0, 0, 255)">INT</span>(<strong>10</strong>) UNSIGNED <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)">6</span> `bio` <span style="color:rgb(0, 0, 255)">TEXT</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)">7</span> <span style="color:rgb(0, 128, 128)">8</span> `created_at` <span style="color:rgb(0, 0, 255)">TIMESTAMP</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">0000-00-00 00:00:00</span><span style="color:rgb(255, 0, 0)">'</span>, <span style="color:rgb(0, 128, 128)">9</span> `updated_at` <span style="color:rgb(0, 0, 255)">TIMESTAMP</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">0000-00-00 00:00:00</span><span style="color:rgb(255, 0, 0)">'</span>,</pre> </div> <p>?</p> <p>我們會(huì)意識(shí)到,遷移是多么的強(qiáng)大,我們自需要記住一些結(jié)構(gòu)生成器方法而不是寫晦澀難懂的SQL DDL代碼。</p> <p>我們創(chuàng)建了表,那我們想要回滾的時(shí)候怎么辦呢?只需要在于up()方法對(duì)應(yīng)的down()方法中使用drop()方法即可。</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> down() <span style="color:rgb(0, 128, 128)">2</span> { <span style="color:rgb(0, 128, 128)">3</span> Schema::drop('authors'); <span style="color:rgb(0, 128, 128)">4</span> }</pre> </div> <p>這個(gè)方法非常簡(jiǎn)單,只有一行。它的全部作用就是刪除”authors”表,如果你熟悉sql,它等同于DROP TABLE authors。</p> <p>現(xiàn)在,我們已經(jīng)寫好了架構(gòu),我們就可以對(duì)數(shù)據(jù)庫(kù)執(zhí)行遷移文件了。轉(zhuǎn)到命令行工具,跳轉(zhuǎn)到應(yīng)用目錄下,運(yùn)行artisan migrate命令:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate</pre> </div> <p>執(zhí)行結(jié)果如下:</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121354540608470.png" style="border:0px" /></p> <p>檢查數(shù)據(jù)庫(kù),你會(huì)發(fā)現(xiàn)已經(jīng)有了”authors”表,</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121355075656145.png" style="border:0px" /></p> <p>表結(jié)構(gòu)如下:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121355201922722.png" style="border:0px" /></p> <p>如果你要使用sql語(yǔ)句實(shí)現(xiàn)這張表,那么sql查詢語(yǔ)句如下:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> <span style="color:rgb(0, 0, 255)">CREATE</span> <span style="color:rgb(0, 0, 255)">TABLE</span> `authors` ( <span style="color:rgb(0, 128, 128)"> 2</span> id <span style="color:rgb(0, 0, 255)">int</span> AUTO_INCREMENT <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)"> 3</span> name <span style="color:rgb(0, 0, 255)">varchar</span>(<strong>255</strong>) <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)"> 4</span> age <span style="color:rgb(0, 0, 255)">int</span>, <span style="color:rgb(0, 128, 128)"> 5</span> active <span style="color:rgb(0, 0, 255)">tinyint</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">1</span><span style="color:rgb(255, 0, 0)">'</span>, <span style="color:rgb(0, 128, 128)"> 6</span> role_id <span style="color:rgb(0, 0, 255)">int</span>(<strong>10</strong>) UNSIGNED <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)"> 7</span> bio <span style="color:rgb(0, 0, 255)">text</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)"> 8</span> created_at <span style="color:rgb(0, 0, 255)">timestamp</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">0000-00-00 00:00:00</span><span style="color:rgb(255, 0, 0)">'</span>, <span style="color:rgb(0, 128, 128)"> 9</span> updated_at <span style="color:rgb(0, 0, 255)">timestamp</span> <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span> <span style="color:rgb(0, 0, 255)">DEFAULT</span> <span style="color:rgb(255, 0, 0)">'</span><span style="color:rgb(255, 0, 0)">0000-00-00 00:00:00</span><span style="color:rgb(255, 0, 0)">'</span>, <span style="color:rgb(0, 128, 128)">10</span> email <span style="color:rgb(0, 0, 255)">varchar</span>(<strong>64</strong>) <span style="color:rgb(128, 128, 128)">NOT</span> <span style="color:rgb(0, 0, 255)">NULL</span>, <span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(0, 128, 128)">/*</span><span style="color:rgb(0, 128, 128)"> Keys </span><span style="color:rgb(0, 128, 128)">*/</span> <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(0, 0, 255)">PRIMARY</span> <span style="color:rgb(0, 0, 255)">KEY</span> (id) <span style="color:rgb(0, 128, 128)">13</span> ) ENGINE <span style="color:rgb(128, 128, 128)">=</span> InnoDB;</pre> </div> <p>現(xiàn)在假設(shè)我們上次的執(zhí)行存在錯(cuò)誤想要回滾,我們自需要使用artisan命令行工具執(zhí)行下面的命令即可:下一次,如果你想修改數(shù)據(jù)模型,你可以創(chuàng)建一個(gè)新的遷移,再次執(zhí)行命令artisan migrate。每一次執(zhí)行artisan migrate命令,它都會(huì)根據(jù)時(shí)間戳去檢查哪些沒有執(zhí)行,如果執(zhí)行了,就跳到下一個(gè)文件,如果沒有執(zhí)行,就執(zhí)行這次遷移,直到執(zhí)行完所有遷移文件。</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:rollback</pre> </div> <p>運(yùn)行如下:</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121356563173922.png" style="border:0px" /></p> <p>你會(huì)發(fā)現(xiàn),表”authors”已經(jīng)從數(shù)據(jù)庫(kù)中刪除了。</p> <p>現(xiàn)在重新創(chuàng)建”authors”表,執(zhí)行artisan migrate命令:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate</pre> </div> <p>這時(shí),表”authors”又重新創(chuàng)建了。</p> <p>但是我想在表中添加”email”列。先使用artisan創(chuàng)建新的遷移文件:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> php artisan migrate:make add_email_to_authors_table</pre> </div> <p>運(yùn)行結(jié)果如下:</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121359331789634.png" style="border:0px" /></p> <p>然后編輯2014_03_12_051119_add_email_to_authors_table.php文件,添加電子郵件列。我們使用Schema::table()方法,有兩個(gè)參數(shù):表名、閉包函數(shù)(在此函數(shù)內(nèi)添加字段)。</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> up() <span style="color:rgb(0, 128, 128)">2</span> { <span style="color:rgb(0, 128, 128)">3</span> Schema::table('authors', <span style="color:rgb(0, 0, 255)">function</span>(<span style="color:rgb(128, 0, 128)">$table</span>) { <span style="color:rgb(0, 128, 128)">4</span> <span style="color:rgb(128, 0, 128)">$table</span> -&gt;<span style="color:rgb(0, 0, 255)">string</span>('email', 64); <span style="color:rgb(0, 128, 128)">5</span> }); <span style="color:rgb(0, 128, 128)">6</span> }</pre> </div> <p>有了添加方法,當(dāng)然也需要添加回滾方法了,這里再次使用Schema::table()方法。</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> down() <span style="color:rgb(0, 128, 128)">2</span> { <span style="color:rgb(0, 128, 128)">3</span> Schema::table('authors', <span style="color:rgb(0, 0, 255)">function</span>(<span style="color:rgb(128, 0, 128)">$table</span>) { <span style="color:rgb(0, 128, 128)">4</span> <span style="color:rgb(128, 0, 128)">$table</span> -&gt;dropColumn('email'); <span style="color:rgb(0, 128, 128)">5</span> }); <span style="color:rgb(0, 128, 128)">6</span> }</pre> </div> <p>?</p> <p>上面的方法使用了dropColumn()方法上出列。</p> <p>現(xiàn)在運(yùn)行artisan命令運(yùn)行該遷移文件如下:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121401112187046.png" style="border:0px" /></p> <p>刷新數(shù)據(jù)庫(kù)表,你會(huì)發(fā)現(xiàn)”email”字段已經(jīng)在”authors”中出現(xiàn)了,如下圖:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121401203196468.png" style="border:0px" /></p> <p>如果我們回滾了這次遷移,那么email字段會(huì)從表中刪除。</p> <p>Artisan命令還有一個(gè)更強(qiáng)大的命令行,它可以回滾所有的遷移:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:<span style="color:rgb(0, 128, 128)">reset</span></pre> </div> <h2>?</h2> <h2><strong>表操作</strong></h2> <p>?</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p>Laravel 方法</p> </td> <td> <p>目的</p> </td> </tr><tr><td> <p><code><strong>create()</strong></code></p> </td> <td> <p>用一個(gè)名稱創(chuàng)建的表。第二個(gè)參數(shù)是包含表定義的閉包。</p> </td> </tr><tr><td> <p><code><strong>drop()</strong></code></p> </td> <td> <p>可以通過<code>drop()</code>方法刪除表。刪除一個(gè)表同時(shí)會(huì)刪除它的所有列和任何索引。</p> </td> </tr><tr><td> <p><code><strong>dropIfExists()</strong></code></p> </td> <td> <p>刪除表 (如果存在)。</p> </td> </tr><tr><td> <p><code><strong>rename($to)</strong></code></p> </td> <td> <p>重命名表。</p> </td> </tr></tbody></table><h2>?</h2> <h2><strong>列操作</strong></h2> <p>?</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p>Laravel 方法</p> </td> <td> <p>目的</p> </td> </tr><tr><td> <p><code><strong>dropColumn($columns)</strong></code></p> </td> <td> <p>刪除指定的列。請(qǐng)記住任何與該列關(guān)聯(lián)的索引也將被刪除。</p> </td> </tr><tr><td> <p><code><strong>dropColumns()</strong></code></p> </td> <td> <p>刪除指定的列。</p> </td> </tr></tbody></table><h2>?</h2> <h2><strong>索引的操作</strong></h2> <p>?</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p>Laravel 方法</p> </td> <td> <p>目的</p> </td> </tr><tr><td> <p><code><strong>primary($columns, $name = null)</strong></code></p> </td> <td> <p>指定表的主鍵。</p> </td> </tr><tr><td> <p><code><strong>unique($columns, $name = null)</strong></code></p> </td> <td> <p>指定表的唯一索引。</p> </td> </tr><tr><td> <p><code><strong>index($columns, $name = null)</strong></code></p> </td> <td> <p>指定表的索引。</p> </td> </tr><tr><td> <p><code><strong>foreign($columns, $name = null)</strong></code></p> </td> <td> <p>指定表的外鍵。</p> </td> </tr><tr><td> <p><code><strong>dropPrimary($index = null)</strong></code></p> </td> <td> <p>刪除給定的主鍵。</p> </td> </tr><tr><td> <p><code><strong>dropUnique($index)</strong></code></p> </td> <td> <p>刪除給定的唯一鍵。</p> </td> </tr><tr><td> <p><code><strong>dropIndex($index)</strong></code></p> </td> <td> <p>刪除給定的索引。</p> </td> </tr><tr><td> <p><code><strong>dropForeign($index)</strong></code></p> </td> <td> <p>刪除給定的外鍵。</p> </td> </tr></tbody></table><p>?</p> <p>參考資料:<a href="http://laravelbook.com/laravel-migrations-managing-databases">http://laravelbook.com/laravel-migrations-managing-databases</a></p> <p>作者更多博客:<a href="http://www.cnblogs.com/huangbx/">Bowen Huang</a></p> <p>未完待續(xù)待續(xù)……</p> <p>?</p> </div></div></div><div id="comment-wrapper-nid-552"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 03:00:03 +0000 Bowen Huang 552 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%94%EF%BC%89%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84#comments Laravel學(xué)習(xí)筆記(四)數(shù)據(jù)庫(kù)遷移案例 http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%9B%9B%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E6%A1%88%E4%BE%8B <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><h2><strong>創(chuàng)建遷移</strong></h2> <p>?</p> <p>首先,讓我們創(chuàng)建一個(gè)MySql數(shù)據(jù)庫(kù)“Laravel_db”。接下來(lái)打開app/config目錄下的database.php文件。請(qǐng)確保default鍵值是mysql:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)">2</span> ... <span style="color:rgb(0, 128, 128)">3</span> 'default' =&gt; 'mysql',</pre> </div> <p>然后輸入你的數(shù)據(jù)庫(kù)配置信息:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> ... <span style="color:rgb(0, 128, 128)"> 2</span> 'connections' =&gt; <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)"> 3</span> 'mysql' =&gt; <span style="color:rgb(0, 0, 255)">array</span>( <span style="color:rgb(0, 128, 128)"> 4</span> 'driver' =&gt; 'mysql', <span style="color:rgb(0, 128, 128)"> 5</span> 'host' =&gt; '127.0.0.1', <span style="color:rgb(0, 128, 128)"> 6</span> 'database' =&gt; 'laravel_db', <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)">數(shù)據(jù)庫(kù)名</span> <span style="color:rgb(0, 128, 128)"> 7</span> 'username' =&gt; 'root, //你的數(shù)據(jù)庫(kù)用戶 <span style="color:rgb(0, 128, 128)"> 8</span> 'password' =&gt; 'Your_Database_Password', //數(shù)據(jù)庫(kù)登錄密碼 <span style="color:rgb(0, 128, 128)"> 9</span> 'charset' =&gt; 'utf8', <span style="color:rgb(0, 128, 128)">10</span> 'collation' =&gt; 'utf8_unicode_ci', <span style="color:rgb(0, 128, 128)">11</span> 'prefix' =&gt; '', <span style="color:rgb(0, 128, 128)">12</span> ), <span style="color:rgb(0, 128, 128)">13</span> ...</pre> </div> <p>我們要使用Laravel命令行工具artisan來(lái)創(chuàng)建我們新的遷移。要運(yùn)行astisan需要打開一個(gè)終端,切換路徑到Laravel引用程序文件夾的更目錄。</p> <p>第一個(gè)我們需要做的就是安裝migrations表,這樣Laravel就可以追蹤哪些遷移已經(jīng)運(yùn)行了。下面的命令將會(huì)在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)特殊的表:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:install</pre> </div> <p>如下:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/120137323241403.png" style="border:0px" /></p> <p>如果創(chuàng)建成功,artisan會(huì)返回“Migration table created successfully.”。</p> <p>查看數(shù)據(jù)庫(kù),你會(huì)發(fā)現(xiàn)artisan確實(shí)創(chuàng)建了一個(gè)新表“migrations”。</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/120137412234652.png" style="border:0px" /></p> <p>你不需要過于關(guān)注這個(gè)表。這只是一個(gè)幫助Laravel監(jiān)視遷移的表。當(dāng)你添加新的遷移,artisan migrate會(huì)檢查migrations表并執(zhí)行那些沒有運(yùn)行的遷移。</p> <p>現(xiàn)在,讓我們創(chuàng)建一個(gè)實(shí)際的遷移文件。我想創(chuàng)建一個(gè)名為“author”的新表。讓我們運(yùn)行artisan migrate:make命令:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:make create_authors_table</pre> </div> <p>運(yùn)行截圖如下:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/120138078509818.png" style="border:0px" /></p> <p>你會(huì)在app/database/migrations目錄下看到文件2014_03_11_162133_create_authors_table.php。</p> <p>正如你看到的,一個(gè)新的遷移文件名稱中包含時(shí)間戳和遷移的描述性名稱。</p> <p>[注]注意細(xì)節(jié)的讀者可能會(huì)注意到我們用“authors”問不是“author”命名作者表。這是Laravel設(shè)計(jì)理念的一方面,使用自然模型幫助我們存儲(chǔ)數(shù)據(jù)模型。Laravel的表應(yīng)該始終命名為你的數(shù)據(jù)模型的復(fù)數(shù)形式。對(duì)于Author模型,表就被命名為“authors”。如果你有一個(gè)模型Car,你需要命名表為“Cars”。另外,<span style="color:#800000"><em>SELECT name FROM authors WHERE id=100?</em></span>比?<span style="color:#800000"><em>SELECT name FROM author WHERE id=100?</em></span>更有意義。</p> <p>?</p> <h2><strong>遷移的解剖</strong></h2> <p>?</p> <p>遷移是Illuminate\Database\Migrations\MigrationLaravel 類的子類。您創(chuàng)建的類必須至少包含類的兩個(gè)方法up()和down()。下面是生成由artisan的骨架遷移類:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> &lt;?php <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Schema\Blueprint; <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Migrations\Migration; <span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 0, 255)">class</span> CreateAuthorsTable <span style="color:rgb(0, 0, 255)">extends</span> Migration { <span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(0, 128, 0)"> * Run the migrations. </span><span style="color:rgb(0, 128, 128)"> 9</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> up() <span style="color:rgb(0, 128, 128)">13</span> { <span style="color:rgb(0, 128, 128)">14</span> <span style="color:rgb(0, 128, 0)">// </span><span style="color:rgb(0, 128, 128)">15</span> } <span style="color:rgb(0, 128, 128)">16</span> <span style="color:rgb(0, 128, 128)">17</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)">18</span> <span style="color:rgb(0, 128, 0)"> * Reverse the migrations. </span><span style="color:rgb(0, 128, 128)">19</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">20</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">21</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">22</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> down() <span style="color:rgb(0, 128, 128)">23</span> { <span style="color:rgb(0, 128, 128)">24</span> <span style="color:rgb(0, 128, 0)">// </span><span style="color:rgb(0, 128, 128)">25</span> } <span style="color:rgb(0, 128, 128)">26</span> }</pre> </div> <p>使用Laravel,我們可以在任何時(shí)間遷移到數(shù)據(jù)模型的特定版本。Up()方法中的代碼執(zhí)行向前遷移,down()執(zhí)行反向遷移(創(chuàng)建數(shù)據(jù)庫(kù)的新版本或者回滾到前一個(gè)版本)。</p> <p>很容易想到up()執(zhí)行遷移文件操作,down()是完全相反。就像word文檔中的撤銷命令——撤銷所做的修改。例如,我們想創(chuàng)建一個(gè)“authors”表,在up()中創(chuàng)建,在down()中撤銷。讓我們看看應(yīng)該怎么做。</p> <p>Artisan migrate:make命令有一些可以加快你工作流的其他選項(xiàng)。讓我們運(yùn)行下面命令:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> php artisan migrate:make create_authors_table --table authors --create</pre> </div> <p>在上面的例子中,我們使用—table選項(xiàng)指定表名。另外,我添加了—create選項(xiàng)去告知artisan這個(gè)表需要被創(chuàng)建。如果我們打開遷移文件,你會(huì)發(fā)現(xiàn)artisan為我們生成了額外的樣板文件代碼:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> &lt;?php <span style="color:rgb(0, 128, 128)"> 2</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Schema\Blueprint; <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 0, 255)">use</span> Illuminate\Database\Migrations\Migration; <span style="color:rgb(0, 128, 128)"> 4</span> <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 0, 255)">class</span> CreateAuthorsTable <span style="color:rgb(0, 0, 255)">extends</span> Migration { <span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(0, 128, 0)"> * Run the migrations. </span><span style="color:rgb(0, 128, 128)"> 9</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> up() <span style="color:rgb(0, 128, 128)">13</span> { <span style="color:rgb(0, 128, 128)">14</span> Schema::table('authors', <span style="color:rgb(0, 0, 255)">function</span>(Blueprint <span style="color:rgb(128, 0, 128)">$table</span>) <span style="color:rgb(0, 128, 128)">15</span> { <span style="color:rgb(0, 128, 128)">16</span> <span style="color:rgb(0, 128, 0)">// </span><span style="color:rgb(0, 128, 128)">17</span> }); <span style="color:rgb(0, 128, 128)">18</span> } <span style="color:rgb(0, 128, 128)">19</span> <span style="color:rgb(0, 128, 128)">20</span> <span style="color:rgb(0, 128, 0)">/*</span><span style="color:rgb(0, 128, 0)">* </span><span style="color:rgb(0, 128, 128)">21</span> <span style="color:rgb(0, 128, 0)"> * Reverse the migrations. </span><span style="color:rgb(0, 128, 128)">22</span> <span style="color:rgb(0, 128, 0)"> * </span><span style="color:rgb(0, 128, 128)">23</span> <span style="color:rgb(0, 128, 0)"> * @return void </span><span style="color:rgb(0, 128, 128)">24</span> <span style="color:rgb(0, 128, 0)">*/</span> <span style="color:rgb(0, 128, 128)">25</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> down() <span style="color:rgb(0, 128, 128)">26</span> { <span style="color:rgb(0, 128, 128)">27</span> Schema::table('authors', <span style="color:rgb(0, 0, 255)">function</span>(Blueprint <span style="color:rgb(128, 0, 128)">$table</span>) <span style="color:rgb(0, 128, 128)">28</span> { <span style="color:rgb(0, 128, 128)">29</span> <span style="color:rgb(0, 128, 0)">// </span><span style="color:rgb(0, 128, 128)">30</span> }); <span style="color:rgb(0, 128, 128)">31</span> } <span style="color:rgb(0, 128, 128)">32</span> }</pre> </div> <p>非常棒!現(xiàn)在,讓我們做更加具體的工作。我們要使用的 Laravel Schema類來(lái)創(chuàng)建我們的"Authors"表。下面是創(chuàng)建作者表,并將必要的列添加到表的遷移代碼:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> up() <span style="color:rgb(0, 128, 128)"> 2</span> { <span style="color:rgb(0, 128, 128)"> 3</span> Schema::create('authors', <span style="color:rgb(0, 0, 255)">function</span>(Blueprint <span style="color:rgb(128, 0, 128)">$table</span>) <span style="color:rgb(0, 128, 128)"> 4</span> { <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)"> auto increment id (primary key)</span> <span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;increments('id'); <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">string</span>('name'); <span style="color:rgb(0, 128, 128)"> 9</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">integer</span>('age')-&gt;nullable(); <span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">boolean</span>('active')-&gt;<span style="color:rgb(0, 0, 255)">default</span>(1); <span style="color:rgb(0, 128, 128)">11</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;<span style="color:rgb(0, 0, 255)">integer</span>('role_id')-&gt;unsigned(); <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;text('bio'); <span style="color:rgb(0, 128, 128)">13</span> <span style="color:rgb(0, 128, 128)">14</span> <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)"> created_at, updated_at DATETIME</span> <span style="color:rgb(0, 128, 128)">15</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;timestamps(); <span style="color:rgb(0, 128, 128)">16</span> }); <span style="color:rgb(0, 128, 128)">17</span> }</pre> </div> <p>我們調(diào)用Schema::create()方法創(chuàng)建一個(gè)新表“authors”。Schema::create()方法有兩個(gè)參數(shù):表名和一個(gè)閉包,閉包中包含了列定義。</p> <p>閉包中,我們可以使用$table參數(shù)創(chuàng)建列。列定義方法的基本結(jié)構(gòu)是:</p> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px; color: rgb(0, 0, 0);"> <pre> <span style="color:rgb(0, 128, 128)">1</span> <span style="color:rgb(128, 0, 128)">$table</span>-&gt;column_type(column_name)</pre> </div> <h2>?</h2> <h2><span style="font-size:20px"><strong>列類型</strong></span></h2> <p>?</p> <p>在前面的示例中,我們指定的名稱列的類型為"string"。但這是什么意思?數(shù)據(jù)庫(kù)中通常沒有”string”類型的列。</p> <p>請(qǐng)記住,Laravel 試圖使您的應(yīng)用程序獨(dú)立于底層的數(shù)據(jù)庫(kù);例如,如果你想,你可以使用 MySql 開發(fā)并部署到 Postgresql。如果您在遷移中使用 MySql 的列類型,應(yīng)用到 Postgres 數(shù)據(jù)庫(kù)可能無(wú)法工作。所以,Laravel 遷移通過使用通用的數(shù)據(jù)類型使你與底層的數(shù)據(jù)庫(kù)類型系統(tǒng)隔離。如果我們要遷移 MySql 數(shù)據(jù)庫(kù),?string()方法將創(chuàng)建VARCHAR(255)類型的列。在 Postgres,同一遷移可能會(huì)添加CHAR VARYING(255)類型的列 (雖然VARCHAR類型支持所有主要的數(shù)據(jù)庫(kù)平臺(tái))。</p> <p>Laravel 直接支持以下數(shù)據(jù)類型:</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p><strong>Laravel?</strong><strong>方法</strong></p> </td> <td> <p><strong>列的類型</strong></p> </td> </tr><tr><td> <p><strong>increments($column)</strong></p> </td> <td> <p>向表中添加自動(dòng)遞增的主鍵</p> </td> </tr><tr><td> <p><strong>string($column)</strong></p> </td> <td> <p>添加一個(gè)VARCHAR(255)列</p> </td> </tr><tr><td> <p><strong>string($column, $length)</strong></p> </td> <td> <p>添加具有長(zhǎng)度的VARCHAR</p> </td> </tr><tr><td> <p><strong>integer($column)</strong></p> </td> <td> <p>向表中添加一個(gè)INTEGER列,</p> </td> </tr><tr><td> <p><strong>float($column)</strong></p> </td> <td> <p>向表中添加一個(gè)FLOAT的列</p> </td> </tr><tr><td> <p><strong>decimal($column, $precision, $scale)</strong></p> </td> <td> <p>添加一個(gè)DECIMAL列的精度和小數(shù)位數(shù)。精度是總數(shù)中數(shù)字的位數(shù)。規(guī)模是小數(shù)點(diǎn)的右側(cè)的位數(shù)。例如,數(shù) 123.45 具有精度為 5 和 2 的小數(shù)。從邏輯上講,規(guī)模不能大于精度。</p> </td> </tr><tr><td> <p><strong>boolean($column)</strong></p> </td> <td> <p>向表中添加一個(gè)BOOLEAN的列。注意: 存儲(chǔ)布爾值的方式而有所不同從一個(gè)數(shù)據(jù)庫(kù)到另一個(gè)數(shù)據(jù)庫(kù)。一些使用"1"和"0"的整數(shù)值來(lái)表示 true 和 false,個(gè)別的,其他人使用"T"和"F"等字符。Laravel 的"boolean"類型映射到數(shù)據(jù)庫(kù)的所有系統(tǒng)上的small integer列。Laravel 很好的處理 PHP 的true與false之間的映射,所以你不需要擔(dān)心。</p> </td> </tr><tr><td> <p><strong>text($column)</strong></p> </td> <td> <p>相當(dāng)于表的TEXT</p> </td> </tr><tr><td> <p><strong>blob($column)</strong></p> </td> <td> <p>相當(dāng)于表的BLOB</p> </td> </tr><tr><td> <p><strong>binary($column)</strong></p> </td> <td> <p>相當(dāng)于表的BINARY</p> </td> </tr><tr><td> <p><strong>dateTime($column)</strong></p> </td> <td> <p>相當(dāng)于表DATETIME</p> </td> </tr><tr><td> <p><strong>timestamp($column)</strong></p> </td> <td> <p>相當(dāng)于表TIMESTAMP</p> </td> </tr><tr><td> <p><strong>date($column)</strong></p> </td> <td> <p>相當(dāng)于表的DATE</p> </td> </tr><tr><td> <p><strong>time($column)</strong></p> </td> <td> <p>相當(dāng)于表的TIME</p> </td> </tr><tr><td> <p><strong>enum($column, array $allowed)</strong></p> </td> <td> <p>在表上創(chuàng)建一個(gè)新的ENUM列</p> </td> </tr></tbody></table><p>此外,還有幾個(gè)你需要知道的擴(kuò)展方法:</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto"><tbody><tr><td> <p><strong>Laravel?</strong><strong>方法</strong></p> </td> <td> <p><strong>列的類型</strong></p> </td> </tr><tr><td> <p><strong>timestamps()</strong></p> </td> <td> <p>timestamps()與timestamp()不同。它是一個(gè) Laravel 用來(lái)管理創(chuàng)建和修改作為created_at和updated_at?TIMESTAMP列的便利方法。他們是 Laravel 可以自己修改的兩個(gè)特殊的數(shù)據(jù)庫(kù)列。created_at列為僅當(dāng)行被創(chuàng)建時(shí)當(dāng)前時(shí)間戳。另一方面,?updated_at被修改為每次操作的行的數(shù)據(jù)時(shí)當(dāng)前時(shí)間戳。</p> </td> </tr><tr><td> <p><strong>nullable()</strong></p> </td> <td> <p>將指定列允許NULL值。默認(rèn)情況下,Laravel 使在數(shù)據(jù)庫(kù)級(jí)別需要通過添加NOT NULL約束的列。</p> </td> </tr><tr><td> <p><strong>default($value)</strong></p> </td> <td> <p>設(shè)置要用于新行作為初始值的列的默認(rèn)值。你永遠(yuǎn)不需要顯式設(shè)置的默認(rèn)值為 null。不設(shè)置它默認(rèn)值就為null。</p> </td> </tr><tr><td> <p><strong>unsigned()</strong></p> </td> <td> <p>設(shè)置INTEGER列為UNSIGNED。</p> </td> </tr></tbody></table><p>?</p> <p>參考資料:<a href="http://laravelbook.com/laravel-migrations-managing-databases/">http://laravelbook.com/laravel-migrations-managing-databases/</a></p> <p>作者更多博客:<a href="http://www.cnblogs.com/huangbx/">Bowen Huang</a></p> <p>未完待續(xù)……</p> <p>?</p> </div></div></div><div id="comment-wrapper-nid-551"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 02:50:00 +0000 Bowen Huang 551 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%9B%9B%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E6%A1%88%E4%BE%8B#comments Laravel學(xué)習(xí)筆記(三)數(shù)據(jù)庫(kù)遷移介紹 http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%89%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E4%BB%8B%E7%BB%8D <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><h2><span style="font-size:14px">該章節(jié)內(nèi)容翻譯自《</span><a href="http://laravelbook.com/laravel-migrations-managing-databases/" style="font-size: 14px; line-height: 1.5;">Database Migration using Laravel</a><span style="font-size:14px">》,一切版權(quán)為原作者。</span></h2> <p>原作者:Stable Host, LLC</p> <p>翻譯作者:Bowen Huang</p> <p>翻譯作者更多博客:<a href="http://www.cnblogs.com/huangbx/">http://www.cnblogs.com/huangbx</a></p> <p>?</p> <h1><strong>正文:</strong></h1> <p>?</p> <p>Laravel鼓勵(lì)敏捷、迭代的開發(fā)方式,我們沒指望在第一次就獲得所有正確的。相反,我們編寫代碼、測(cè)試和與我們的最終用戶進(jìn)行交互,并完善我們的理解。</p> <p>對(duì)于工作,我們需要一個(gè)配套的實(shí)踐集。我們使用像subversion、GIT或Mercurial這些版本控制工具來(lái)存儲(chǔ)應(yīng)用程序的源代碼文件,使我們能夠撤消錯(cuò)誤和追蹤開發(fā)過程中的改變。</p> <p>但應(yīng)用程序更改時(shí),存在我們不能單獨(dú)使用版本控制進(jìn)行有效管理的區(qū)域。在我們的開發(fā)進(jìn)度中,Laravel應(yīng)用程序的數(shù)據(jù)庫(kù)架構(gòu)不斷演變:我們?cè)谶@里添加了一個(gè)表,在那里重命名列,刪除索引等等。數(shù)據(jù)庫(kù)的改變與應(yīng)用程序代碼步調(diào)一致。</p> <p>你需要一個(gè)復(fù)雜的方法來(lái)跟蹤您的數(shù)據(jù)庫(kù)架構(gòu)更改,通常有幾種方法:</p> <ul><li>當(dāng)您在開發(fā)團(tuán)隊(duì)內(nèi)工作時(shí),每人都需要知道關(guān)于任何架構(gòu)的更改。</li> <li>當(dāng)你在生產(chǎn)服務(wù)器上部署時(shí),您需要有穩(wěn)健的方式來(lái)升級(jí)您的數(shù)據(jù)庫(kù)架構(gòu)。</li> <li>如果您在多臺(tái)機(jī)器上工作,你需要保持所有數(shù)據(jù)庫(kù)架構(gòu)的同步。</li> </ul><p>如果沒有嚴(yán)格的約定和紀(jì)律讓應(yīng)用程序開發(fā)者遵循,保持?jǐn)?shù)據(jù)庫(kù)架構(gòu)與應(yīng)用程序代碼同步歷來(lái)是一個(gè)非常麻煩的工作。開發(fā)者(或數(shù)據(jù)庫(kù)管理員) 進(jìn)行所需的架構(gòu)更改。但是,如果應(yīng)用程序代碼回滾到以前的版本,但是很難撤消數(shù)據(jù)庫(kù)架構(gòu)更改,照成數(shù)據(jù)庫(kù)版本信息與應(yīng)用程序代碼版本信息不一致。</p> <p>遷移就是幫助你進(jìn)化你的應(yīng)用程序數(shù)據(jù)架構(gòu)的Laravel方式,它不需要你在每次改變的時(shí)候刪除或者重建數(shù)據(jù)庫(kù)。沒有刪除和重建就意味著你不會(huì)在每次改變的時(shí)候丟失數(shù)據(jù)。當(dāng)你執(zhí)行遷移時(shí)唯一的改變就是將數(shù)據(jù)庫(kù)架構(gòu)從一個(gè)版本移到另一個(gè)版本,不管是向前還是向后移。</p> <p>Laravel遷移給你提供了一種在迭代方式中修改數(shù)據(jù)庫(kù)架構(gòu)的手段,它不要你用SQL操作,而是允許你使用PHP代碼。Laravel架構(gòu)生成器允許我們快速創(chuàng)建數(shù)據(jù)庫(kù)表和插入列或索引。它使用清潔和富有表現(xiàn)力的語(yǔ)法來(lái)操作數(shù)據(jù)庫(kù)。你也許為認(rèn)為L(zhǎng)aravel遷移就是數(shù)據(jù)庫(kù)的版本控制。</p> <p>通過定義一個(gè)更高級(jí)別的接口來(lái)創(chuàng)建和維護(hù)數(shù)據(jù)庫(kù)架構(gòu),你可以用與數(shù)據(jù)庫(kù)無(wú)關(guān)的方式定義它。通過使用 PHP 來(lái)創(chuàng)建表,定義列和索引,寫一次架構(gòu)并將其應(yīng)用到任何所支持的數(shù)據(jù)庫(kù)后端。額外的好處是 ,Laravel 跟蹤已經(jīng)應(yīng)用了哪些遷移和哪些仍需要應(yīng)用。</p> <p>?</p> <h2><strong>遷移基礎(chǔ)知識(shí)</strong></h2> <p>?</p> <p>一個(gè)Laravel遷移僅僅是你應(yīng)用程序app/database/migrations目錄下的PHP源文件。每個(gè)文件都包含了對(duì)底層數(shù)據(jù)庫(kù)的一組改變。對(duì)數(shù)據(jù)庫(kù)的改變是在PHP代碼中而不是數(shù)據(jù)庫(kù)特定的SQL。你的PHP遷移代碼最終被轉(zhuǎn)換成符合你當(dāng)前數(shù)據(jù)庫(kù)的DDL,這使得切換數(shù)據(jù)庫(kù)平臺(tái)非常的容易。由于遷移代碼保存在自己的目錄中,就務(wù)必要像其他的項(xiàng)目代碼一樣包含到版本控制里面。Laravel遷移是使用Artisan工具用命令行顯示運(yùn)行的。</p> <p>?</p> <h2><strong>遷移文件命名約定</strong></h2> <p>?</p> <p>在舊版本Laravel的,遷移的文件有比較簡(jiǎn)單的名字,如001_create_employees_table.php 。 Laravel 3(Laravel 4.1和其相同)帶來(lái)了新的命名約定,其中名稱的第一部分從一個(gè)序列號(hào)變更為更長(zhǎng)的時(shí)間,像2014_03_11_032903_create_employees_table.php。該文件的名稱的形式Y(jié)YYY_MM_DD_HHMMSS_some_meaningful_name.php的,也就是說一個(gè)UTC時(shí)間戳識(shí)別后跟一個(gè)遷移名。</p> <p>新的更寬的名字有助于避免名稱沖突,如果你是工作在一個(gè)團(tuán)隊(duì)里的一個(gè)開發(fā)人員,你可以檢查自己的遷移。</p> <p>此外, Laravel遷移文件的時(shí)間戳,以便他們可以順序執(zhí)行。時(shí)間戳數(shù)字是遷移的關(guān)鍵,因?yàn)樗鼈兌x了哪一個(gè)遷移應(yīng)用在獨(dú)立遷移版本號(hào)的順序。</p> <p>想SQL腳本,遷移從頂部開始執(zhí)行,這更加需要這些文件才能被執(zhí)行。順序執(zhí)行移除了類似這樣的可能性——在表不存在的時(shí)候嘗試插入列。</p> <p>盡管你可以手動(dòng)創(chuàng)建遷移文件,但是使用Artisan工具生成遷移腳本更加的容易(并且不易出錯(cuò))。你可以根據(jù)需要在以后編輯這些文件。</p> <h3>運(yùn)行遷移Forward 和 Backward</h3> <p>使用Artisan工具遷移到數(shù)據(jù)庫(kù)。Laravel提供了一套artisan任務(wù),可以歸結(jié)為運(yùn)行特定的幾套遷移。</p> <p><strong>[</strong><strong>注]</strong><strong>你可以運(yùn)行artisan list</strong><strong>同查看artisan</strong><strong>支持的任務(wù)列表,大多數(shù)數(shù)據(jù)遷移相關(guān)的任務(wù)都帶有前綴migrate:</strong><strong>。</strong></p> <p>只有幾個(gè)你需要知道的常見任務(wù):</p> <ul><li>migrate:install<br /> 你第一次使用的與遷移有關(guān)的artisan任務(wù)可能就是migrate:install。在內(nèi)部,Laravel使用特殊的表來(lái)跟蹤哪些遷移已經(jīng)運(yùn)行。若要?jiǎng)?chuàng)建此表,只需要用artisan命令行工具:<br /> $php artisan migrate:install</li> <li>migrate<br /> 你將會(huì)運(yùn)行migrate任務(wù)頻繁的更新你的數(shù)據(jù)庫(kù),以支持你添加到應(yīng)用程序中的最新的表和列。最基本的形式,它只會(huì)對(duì)那些所有沒有被運(yùn)行過的遷移運(yùn)行up()方法。如果沒有這樣的遷移,會(huì)退出。它將基于遷移的日期來(lái)運(yùn)行這些遷移。</li> <li>migrate:rollback<br /> 在寫遷移時(shí)偶爾也會(huì)犯錯(cuò)誤。如果你已經(jīng)運(yùn)行了遷移,那么你不能只是編輯遷移和再次運(yùn)行遷移:Laravel假定它已經(jīng)運(yùn)行了遷移,那么當(dāng)你再次運(yùn)行artisan migrate,不會(huì)做任何事情。你必須使用artisan migrate:rollback回滾遷移,然后編輯遷移,再運(yùn)行artisan migrate去運(yùn)行正確的版本。</li> </ul><p>一般情況下,編輯現(xiàn)有的遷移不是好主意:你和你的同事將會(huì)需要額外的工作,并且這是一件讓人頭痛的事——如果現(xiàn)存版本的遷移已經(jīng)運(yùn)行在生產(chǎn)機(jī)器上。相反,你需要寫一個(gè)新的遷移去執(zhí)行所需的改變。</p> <p><strong>[注]artisan migrate:rollback 會(huì)刪除上次的遷移應(yīng)用。Laravel回滾整個(gè)遷移“操作”。因此,如果上次的遷移命令運(yùn)行了15個(gè)遷移,這15個(gè)遷移都會(huì)被回滾。請(qǐng)注意,當(dāng)你刪除列或者表,會(huì)丟失數(shù)據(jù)。</strong></p> <ul><li>migrate:reset<br /> 回滾所有的遷移(會(huì)刪掉所有表和數(shù)據(jù))</li> <li>migrate:refresh<br /> artisan migrate:refresh任務(wù)將刪除數(shù)據(jù)庫(kù)、 重新創(chuàng)建它并將加載當(dāng)前架構(gòu)。這是一個(gè)方便快捷方式去運(yùn)行重置并隨后重新運(yùn)行所有遷移。</li> <li>migrate:make<br /> artisan migrate:make命令告訴 Laravel 來(lái)生成一個(gè)遷移文件骨架 (這是實(shí)際上是一個(gè) PHP 文件) ,存放到app/database/migrations文件夾中。然后,您可以編輯此文件來(lái)充實(shí)您的表/索引定義。然后,artisan migrate命令運(yùn)行時(shí),artisan會(huì)查詢此文件來(lái)生成 SQL DDL 的實(shí)際代碼。</li> </ul><p>?</p> <p>接下來(lái)會(huì)詳細(xì)描述數(shù)據(jù)庫(kù)遷移</p> <p>未完待續(xù)……</p> <p>?</p> </div></div></div><div id="comment-wrapper-nid-550"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 02:44:30 +0000 Bowen Huang 550 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%89%EF%BC%89%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E4%BB%8B%E7%BB%8D#comments Laravel學(xué)習(xí)筆記(二)Laravel 應(yīng)用程序的體系結(jié)構(gòu) http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%8C%EF%BC%89laravel-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><h2><span style="font-size:13px; line-height:1.6em">在一切環(huán)境就緒了,當(dāng)然就要開始了解框架了。</span></h2> <p>站在巨人的肩膀上,學(xué)東西會(huì)事半功倍。我在網(wǎng)上找到一篇好文章,正好可以讓我輕松了解Laravel應(yīng)用程序的體系結(jié)構(gòu)。因此借來(lái)直接用了。</p> <p>該章節(jié)內(nèi)容翻譯自<a href="http://laravelbook.com/laravel-architecture/">《Architecture of Laravel Applications》</a>,一切版權(quán)為原作者,由于原作者寫這篇文章時(shí)Laravel版本還沒有到4.1,一些地方有稍微差別,我會(huì)稍作修改。</p> <p>原作者:Stable Host, LLC(不知道找對(duì)了沒有)</p> <p>翻譯作者:Bowen Huang</p> <p>翻譯作者更多博客:<a href="http://www.cnblogs.com/huangbx/">http://www.cnblogs.com/huangbx</a></p> <p>?</p> <h1><strong>正文:</strong></h1> <p>?</p> <p>Laravel被稱為“全?!笔娇蚣?,因?yàn)樗幚韽木W(wǎng)絡(luò)服務(wù)到數(shù)據(jù)庫(kù)管理,直到HTML生成的一切事情,一個(gè)垂直集成的web開發(fā)環(huán)境能給開發(fā)者提供更好的體驗(yàn)。</p> <p>一個(gè)典型的程序員通過命令行工具與Laravel交互,生成和管理Laravel項(xiàng)目環(huán)境。Laravel帶有一個(gè)名為Artisan的優(yōu)秀的命令行工具,可以用它來(lái)生成框架代碼和數(shù)據(jù)庫(kù)架構(gòu),Artisan能夠處理從數(shù)據(jù)庫(kù)架構(gòu)遷移到資源和配置管理的一切事情。</p> <p>?</p> <h2><strong>約定優(yōu)于配置</strong></h2> <p>?</p> <p>Laravel 的有趣的特征之一,在如何構(gòu)建 web 應(yīng)用程序上它規(guī)定了一些相當(dāng)嚴(yán)重的限制。出人意料的是,這些限制使創(chuàng)建應(yīng)用更加的容易——輕松了很多。讓我們來(lái)看看為什么。</p> <p>Laravel區(qū)別于其他垂直集成開發(fā)環(huán)境在于它強(qiáng)烈的偏好約定優(yōu)于配置。而一些 Java,Python 或 PHP 框架往往需要大量的 XML 配置,Laravel在開始的時(shí)候幾乎不需要配置(也許只有幾行在PHP中)。這種對(duì)配置文件的規(guī)避行為使其非常獨(dú)特,在所有 Laravel 應(yīng)用程序中可識(shí)別的代碼結(jié)構(gòu)是相同的。</p> <p>?</p> <h2><strong>一個(gè)項(xiàng)目結(jié)構(gòu)來(lái)統(tǒng)治他們所有 !</strong></h2> <p>?</p> <p>這并不奇怪,所有Laravel項(xiàng)目基本上具有相同的目錄結(jié)構(gòu) ——在其中的每個(gè)文件都有其指定的地方。通過這種約定的目錄結(jié)果,可以確保開發(fā)者按照“Laravel way”工作。</p> <p>圖 1.1 顯示了 Laravel 項(xiàng)目目錄結(jié)構(gòu)是什么樣子:</p> <p class="rtecenter"><img alt="" src="http://images.cnitblog.com/i/431820/201403/071625168621849.png" style="border:0px" />?</p> <p class="rtecenter">圖1.1 Laravel 項(xiàng)目目錄結(jié)構(gòu)</p> <p>就如你看到這樣,laravel下面只包含了4個(gè)文件夾,這4個(gè)文件夾下面有一些子文件夾,這種豐富的子文件夾在第一次看到是不是有壓力?我會(huì)逐個(gè)介紹。我們大部分的開發(fā)工作都會(huì)在app/文件夾下面進(jìn)行。</p> <p>下面是各個(gè)文件夾和文件的基本介紹:</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p><strong>頂級(jí)文件夾</strong></p> </td> <td> <p><strong>作用</strong></p> </td> </tr><tr><td> <p><strong>app</strong></p> </td> <td> <p>包含了站點(diǎn)的controllers(控制器),models(模型),views(視圖)和assets(資源)。這些是網(wǎng)站運(yùn)行的主要代碼,你會(huì)將你大部分的時(shí)間花在這些上面。</p> </td> </tr><tr><td> <p><strong>bootstrap</strong></p> </td> <td> <p>用來(lái)存放系統(tǒng)啟動(dòng)時(shí)需要的文件,這些文件會(huì)被如index.php這樣的文件調(diào)用。</p> </td> </tr><tr><td> <p><strong>public</strong></p> </td> <td> <p>這個(gè)文件夾是唯一外界可以看到的,是必須指向你web服務(wù)器的目錄。它含有l(wèi)aravel框架核心的引導(dǎo)文件index.php,這個(gè)目錄也可用來(lái)存放任何可以公開的靜態(tài)資源,如css,Javascript,images等。</p> </td> </tr><tr><td> <p><strong>vendor</strong></p> </td> <td> <p>用來(lái)存放所有的第三方代碼,在一個(gè)典型的Laravel應(yīng)用程序,這包括Laravel源代碼及其相關(guān),并含有額外的預(yù)包裝功能的插件。</p> </td> </tr></tbody></table><p>?</p> <p>正如上面提到的,/app是所有的樂趣產(chǎn)生的地方,讓我們更深入的看看這個(gè)目錄的結(jié)構(gòu)。</p> <p>圖 1.2 顯示/app文件夾的詳細(xì)信息:</p> <p class="rtecenter">?<img alt="" src="http://images.cnitblog.com/i/431820/201403/071625258005786.png" style="border:0px" /></p> <p class="rtecenter">圖1.2 app 文件夾詳細(xì)信息</p> <p>下面是詳細(xì)介紹:</p> <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse; border:1px solid rgb(192, 192, 192); cursor:default; font-family:verdana,arial,helvetica,sans-serif; margin:0px auto; width:100%"><tbody><tr><td> <p><strong>文件的文件夾</strong></p> </td> <td> <p><strong>作用</strong></p> </td> </tr><tr><td> <p><strong>/app/config/</strong></p> </td> <td> <p>配置應(yīng)用程序的運(yùn)行時(shí)規(guī)則、 數(shù)據(jù)庫(kù)、 session等等。包含大量的用來(lái)更改框架的各個(gè)方面的配置文件。大部分的配置文件中返回的選項(xiàng)關(guān)聯(lián)PHP數(shù)組。</p> </td> </tr><tr><td> <p><strong>/app/config/app.php</strong></p> </td> <td> <p>各種應(yīng)用程序級(jí)設(shè)置,即時(shí)區(qū)、 區(qū)域設(shè)置(語(yǔ)言環(huán)境)、 調(diào)試模式和獨(dú)特的加密密鑰。</p> </td> </tr><tr><td> <p><strong>/app/config/auth.php</strong></p> </td> <td> <p>控制在應(yīng)用程序中如何進(jìn)行身份驗(yàn)證,即身份驗(yàn)證驅(qū)動(dòng)程序。</p> </td> </tr><tr><td> <p><strong>/app/config/cache.php</strong></p> </td> <td> <p>如果應(yīng)用程序利用緩存來(lái)加快響應(yīng)時(shí)間,要在此配置該功能。</p> </td> </tr><tr><td> <p><strong>/app/config/compile.php</strong></p> </td> <td> <p>在此處可以指定一些額外類,去包含由‘a(chǎn)rtisan optimize’命令聲稱的編譯文件。這些應(yīng)該是被包括在基本上每個(gè)請(qǐng)求到應(yīng)用程序中的類。</p> </td> </tr><tr><td> <p><strong>/app/config/database.php</strong></p> </td> <td> <p>包含數(shù)據(jù)庫(kù)的相關(guān)配置信息,即默認(rèn)數(shù)據(jù)庫(kù)引擎和連接信息。</p> </td> </tr><tr><td> <p><strong>/app/config/mail.php</strong></p> </td> <td> <p>為電子郵件發(fā)件引擎的配置文件,即 SMTP 服務(wù)器,F(xiàn)rom:標(biāo)頭</p> </td> </tr><tr><td> <p><strong>/app/config/session.php</strong></p> </td> <td> <p>控制Laravel怎樣管理用戶sessions,即session driver, session lifetime。</p> </td> </tr><tr><td> <p><strong>/app/config/view.php</strong></p> </td> <td> <p>模板系統(tǒng)的雜項(xiàng)配置。</p> </td> </tr><tr><td> <p><strong>/app/controllers</strong></p> </td> <td> <p>包含用于提供基本的邏輯、 數(shù)據(jù)模型交互以及加載應(yīng)用程序的視圖文件的控制器類。</p> </td> </tr><tr><td> <p><strong>/app/database/migrations/</strong></p> </td> <td> <p>包含一些 PHP 類,允許 Laravel更新當(dāng)前數(shù)據(jù)庫(kù)的架構(gòu)并同時(shí)保持所有版本的數(shù)據(jù)庫(kù)的同步。遷移文件是使用Artisan工具生成的。</p> </td> </tr><tr><td> <p><strong>/app/database/seeds/</strong></p> </td> <td> <p>包含允許Artisan工具用關(guān)系數(shù)據(jù)來(lái)填充數(shù)據(jù)庫(kù)表的 PHP 文件。</p> </td> </tr><tr><td> <p><strong>/app/lang/</strong></p> </td> <td> <p>PHP 文件,其中包含使應(yīng)用程序易于本地化的字符串的數(shù)組。默認(rèn)情況下目錄包含英語(yǔ)語(yǔ)言的分頁(yè)和表單驗(yàn)證的語(yǔ)言行。</p> </td> </tr><tr><td> <p><strong>/app/models/</strong></p> </td> <td> <p>模型是代表應(yīng)用程序的信息(數(shù)據(jù))和操作數(shù)據(jù)的規(guī)則的一些類。在大多數(shù)情況下,數(shù)據(jù)庫(kù)中的每個(gè)表將對(duì)應(yīng)應(yīng)用中的一個(gè)模型。應(yīng)用程序業(yè)務(wù)邏輯的大部分將集中在模型中。</p> </td> </tr><tr><td> <p><strong>/app/start/</strong></p> </td> <td> <p>包含與Artisan工具以及全球和本地上下文相關(guān)的自定義設(shè)置。</p> </td> </tr><tr><td> <p><strong>/app/storage/</strong></p> </td> <td> <p>該目錄存儲(chǔ)Laravel各種服務(wù)的臨時(shí)文件,如session, cache,? compiled view templates。這個(gè)目錄在web服務(wù)器上必須是可以寫入的。該目錄由Laravel維護(hù),我們可以不關(guān)心。</p> </td> </tr><tr><td> <p><strong>/app/tests/</strong></p> </td> <td> <p>該文件夾給你提供了一個(gè)方便的位置,用來(lái)做單元測(cè)試。如果你使用PHPUnit,你可以使用Artisan工具一次執(zhí)行所有的測(cè)試。</p> </td> </tr><tr><td> <p><strong>/app/views/</strong></p> </td> <td> <p>該文件夾包含了控制器或者路由使用的HTML模版。請(qǐng)注意,這個(gè)文件夾下你只能放置模版文件。其他的靜態(tài)資源文件如css, javascript和images文件應(yīng)該放在/public文件夾下。</p> </td> </tr><tr><td> <p><strong>/app/routes.php</strong></p> </td> <td> <p>這是您的應(yīng)用程序的路由文件,其中包含路由規(guī)則,告訴 Laravel 如何將傳入的請(qǐng)求連接到路由處理的閉包函數(shù)、 控制器和操作。該文件還包含幾個(gè)事件聲明,包括錯(cuò)誤頁(yè)的,可以用于定義視圖的composers。</p> </td> </tr><tr><td> <p><strong>/app/filters.php</strong></p> </td> <td> <p>此文件包含各種應(yīng)用程序和路由篩選方法,用來(lái)改變您的應(yīng)用程序的結(jié)果。Laravel 具有訪問控制和 XSS 保護(hù)的一些預(yù)定義篩選器。</p> </td> </tr></tbody></table><p>花了很多心思在建立和命名文件夾上,得到的就是一個(gè)具有良好的文件系統(tǒng)的應(yīng)用程序。</p> <p>在這里你得到了什么:MVC</p> <p>?</p> <h2><strong>模型-視圖-控制器(MVC)</strong></h2> <p>?</p> <p>讓我們進(jìn)入Laravel應(yīng)用工作的高級(jí)別概述。你可能已經(jīng)注意到了標(biāo)準(zhǔn)的Laravel應(yīng)用程序結(jié)構(gòu)由一個(gè)應(yīng)用程序目錄app/,它含有三個(gè)子目錄:models/,views/和controllers/。這就透露了Laravel遵循model-view-controller(MVC)架構(gòu)模式,就是強(qiáng)制將輸入到展示邏輯關(guān)系的“業(yè)務(wù)邏輯”與圖形用戶界面(GUI)分開。就Laravel web應(yīng)用而言,業(yè)務(wù)邏輯通常由像用戶,博客文章這樣的數(shù)據(jù)模型組成。GUI只是瀏覽器中的網(wǎng)頁(yè)而已。MVC設(shè)計(jì)模式在網(wǎng)頁(yè)開發(fā)領(lǐng)域很流行。</p> <p>MVC模式的3個(gè)組件:</p> <ul><li>模型(model)</li> <li>視圖(view)</li> <li>控制器(controller)</li> </ul><p>[注] 原作者在這里詳細(xì)介紹了MVC三個(gè)組成部分,我這里由于篇幅就不介紹了。</p> <p>?</p> <h2><strong>Laravel組件</strong></h2> <p>?</p> <p>一個(gè)典型的Laravel應(yīng)用程序包含上面提到的MVC組件,如下圖:</p> <p class="rtecenter">?<img alt="" src="http://images.cnitblog.com/i/431820/201403/071626088464369.png" style="border:0px" /></p> <p>當(dāng)與Laravel交互時(shí),瀏覽器發(fā)送一個(gè)請(qǐng)求,web服務(wù)器接收到請(qǐng)求并且傳給Laravel路由引擎。Laravel路由接收到請(qǐng)求,然后重定向給基于路由的URL模式的合適的控制器類方法。</p> <p>然后控制器類接管。在某種情況下,控制器會(huì)立即呈現(xiàn)出一個(gè)視圖,它是一個(gè)被轉(zhuǎn)換成HTML并送回瀏覽器的模版。更常見的動(dòng)態(tài)網(wǎng)站,控制器與模型交互,這是一個(gè)PHP對(duì)象,它表示應(yīng)用程序(如用戶、博客文章)中的一個(gè)元素,并負(fù)責(zé)與數(shù)據(jù)庫(kù)進(jìn)行通信的。調(diào)用模型后,控制器則呈現(xiàn)最終視圖( HTML,CSS和圖像),并返回完整的網(wǎng)頁(yè)到用戶的瀏覽器。</p> <p>Laravel促進(jìn)了這樣的概念——模型、視圖和控制器,應(yīng)通過存儲(chǔ)這些元素在不同的目錄中的單獨(dú)的代碼文件中來(lái)保持相當(dāng)?shù)莫?dú)立性。這就是Laravel目錄結(jié)構(gòu)發(fā)揮了作用。</p> <p>像MVC這樣的設(shè)計(jì)模式的產(chǎn)生,就是為了讓開發(fā)者的生活更加的輕松。這就是Laravel比那些不用任何模式的PHP厲害的地方。如果這種討論很抽象,現(xiàn)在,不用擔(dān)心!當(dāng)你開始Laravel工作,你都不會(huì)意識(shí)到你是在一種設(shè)計(jì)模式中工作。過一段時(shí)間后,就會(huì)變得自然了。</p> <p>?</p> <h2><strong>數(shù)據(jù)模型</strong></h2> <p>?</p> <p>數(shù)據(jù)模型是任何應(yīng)用程序的基礎(chǔ),它描述了應(yīng)用程序的業(yè)務(wù)邏輯。任何一塊的數(shù)據(jù)都是用數(shù)據(jù)庫(kù)表來(lái)表示的。Laravel提供了一些技術(shù)來(lái)簡(jiǎn)化對(duì)數(shù)據(jù)庫(kù)的訪問。</p> <p>Laravel通過將數(shù)據(jù)庫(kù)中的表行轉(zhuǎn)成能被輕松操縱的PHP對(duì)象,來(lái)連接應(yīng)用程序的數(shù)據(jù)模型和數(shù)據(jù)庫(kù)表。它還使您能夠執(zhí)行業(yè)務(wù)規(guī)則,描述在應(yīng)用程序中不同的數(shù)據(jù)模型之間的關(guān)系等。例如,一個(gè)人的家庭關(guān)系可以用Laravel Eloquent OR / M描述如下:</p> <div style="color: rgb(0, 0, 0); font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;"> <div class="cnblogs_code" style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; word-break: break-all; overflow: auto; width: 100%; margin: 5px 0px;"> <pre> <span style="color:rgb(0, 128, 128)"> 1</span> <span style="color:rgb(0, 0, 255)">class</span> Person <span style="color:rgb(0, 0, 255)">extends</span> Eloquent <span style="color:rgb(0, 128, 128)"> 2</span> { <span style="color:rgb(0, 128, 128)"> 3</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> mother() <span style="color:rgb(0, 128, 128)"> 4</span> { <span style="color:rgb(0, 128, 128)"> 5</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;belongsTo('Mother'); <span style="color:rgb(0, 128, 128)"> 6</span> } <span style="color:rgb(0, 128, 128)"> 7</span> <span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> father() <span style="color:rgb(0, 128, 128)"> 9</span> { <span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;belongsTo('Father'); <span style="color:rgb(0, 128, 128)">11</span> } <span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(0, 128, 128)">13</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> spouse() <span style="color:rgb(0, 128, 128)">14</span> { <span style="color:rgb(0, 128, 128)">15</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;hasOne('Spouse'); <span style="color:rgb(0, 128, 128)">16</span> } <span style="color:rgb(0, 128, 128)">17</span> <span style="color:rgb(0, 128, 128)">18</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> sisters() <span style="color:rgb(0, 128, 128)">19</span> { <span style="color:rgb(0, 128, 128)">20</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;hasMany('Sister'); <span style="color:rgb(0, 128, 128)">21</span> } <span style="color:rgb(0, 128, 128)">22</span> <span style="color:rgb(0, 128, 128)">23</span> <span style="color:rgb(0, 0, 255)">public</span> <span style="color:rgb(0, 0, 255)">function</span> brothers() <span style="color:rgb(0, 128, 128)">24</span> { <span style="color:rgb(0, 128, 128)">25</span> <span style="color:rgb(0, 0, 255)">return</span> <span style="color:rgb(128, 0, 128)">$this</span>-&gt;hasMany('Brother'); <span style="color:rgb(0, 128, 128)">26</span> } <span style="color:rgb(0, 128, 128)">27</span> }</pre> </div> <p>?</p> <p>如果翻譯有什么錯(cuò)誤,歡迎指出來(lái)。</p> <p><strong>未完待續(xù)……</strong></p> </div> </div></div></div><div id="comment-wrapper-nid-549"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 02:35:48 +0000 Bowen Huang 549 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%8C%EF%BC%89laravel-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84#comments Laravel學(xué)習(xí)筆記(一)安裝配置開發(fā)環(huán)境 http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>?</p> <h1>摘要</h1> <p>?</p> <p>Laravel的目標(biāo)是給開發(fā)者創(chuàng)造一個(gè)愉快的開發(fā)過程,并且不犧牲應(yīng)用的功能性??鞓返拈_發(fā)者才能創(chuàng)造最棒的代碼!為了這個(gè)目的,開發(fā)者博取眾框架之長(zhǎng)處集中到Laravel中,這些框架甚至是基于Ruby on Rails、ASP.NET MVC、和Sinatra等開發(fā)語(yǔ)言或工具的。</p> <p>?</p> <h1>對(duì)Laravel初步認(rèn)知</h1> <p>?</p> <p>剛從事PHP開發(fā)沒多久,對(duì)PHP的一些框架了解甚少,在CSDN上看到一篇文章<a href="http://www.csdn.net/article/2014-01-03/2818006-PHP-framework-Laravel">《PHP開發(fā)框架流行度排名:Laravel居首》</a>,才知道還有Laravel這么個(gè)框架,正好<a href="http://www.smt18.com/">公司</a>想從事Laravel的開發(fā),就學(xué)習(xí)一下。然后搜索了大量的資料,了解到了它是什么。</p> <p>至于它的詳細(xì)介紹我就不說了,google一下,就有了。</p> <p>?</p> <h1>Laravel環(huán)境搭建</h1> <p>?</p> <p>在有了初步認(rèn)知后,當(dāng)然就要開始在自己的電腦上搭建Laravel的開發(fā)環(huán)境了。</p> <p>?</p> <h2>系統(tǒng)環(huán)境需求</h2> <p>?</p> <ul><li>PHP 5.3.7或者更高版本,如果沒有系統(tǒng)沒有安裝PHP環(huán)境的,請(qǐng)到下面地址下載:<a href="http://cn2.php.net/downloads.php">http://cn2.php.net/downloads.php</a></li> <li>電腦上具有web服務(wù)器,IIS,apache或者其它web服務(wù)器</li> <li>MCrypt PHP擴(kuò)展</li> </ul><p>?</p> <h2>安裝Composer</h2> <p>?</p> <p>Laravel框架使用<a href="http://getcomposer.org/" target="_blank">Composer</a>(PHP包管理工具,參考?<a href="http://composer.golaravel.com/" target="_blank">Composer 中文文檔</a>)來(lái)管理代碼依賴性。Windows操作系統(tǒng)中,你可以使用Composer的<a href="https://getcomposer.org/Composer-Setup.exe" target="_blank">Windows安裝工具</a>。下載后直接安裝就可以了,安裝之后,可以在控制臺(tái)輸入composer查看是否安裝成功。</p> <p><img alt="" src="http://images.cnitblog.com/i/431820/201403/061737547069723.png" style="border:0px" /></p> <p>?</p> <h2>安裝Laravel</h2> <p>?</p> <ul><li>在Github下載最新版本(目前4.1):<a href="https://github.com/laravel/laravel/archive/master.zip">https://github.com/laravel/laravel/archive/master.zip</a></li> <li>將文件解壓到你想要的任何位置,例如,我解壓到我的H盤Laravel_site目錄下<br /><img alt="" src="http://images.cnitblog.com/i/431820/201403/061738179717450.png" style="border:0px" /></li> <li>控制臺(tái)進(jìn)入該目錄(Laravel_site),執(zhí)行命令composer install,然后程序會(huì)下載必要安裝文件,要保證網(wǎng)絡(luò)暢通<br /><img alt="" src="http://images.cnitblog.com/i/431820/201403/061738428931702.png" style="border:0px" /></li> <li>安裝完成后如下圖:<br /><img alt="" src="http://images.cnitblog.com/i/431820/201403/061738515655952.png" style="border:0px" /></li> <li>然后觀察文件目錄下,多了一個(gè)vendor文件夾,composer.lock文件也被修改了。</li> </ul><p>當(dāng)然還有一種安裝方式,就是直接下載完整安裝包,解壓即可,下載地址:<a href="http://ci.laravel-cn.com/laravel.zip">http://ci.laravel-cn.com/laravel.zip</a></p> <p>?</p> <h2>服務(wù)器配置</h2> <p>?</p> <p>在上面的操作完成后,就是配置該站點(diǎn)在web服務(wù)器上,我相信這些操作,只要有過網(wǎng)站開發(fā)經(jīng)驗(yàn)的人都有,我就不詳細(xì)介紹了。這里要注意一點(diǎn)的就是,配置網(wǎng)站的時(shí)候,根目錄是public,為不是最Laravel_site,配置好了,運(yùn)行如下:</p> <p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/061739076431940.png" style="border:0px" /></p> <p>安裝順利完成!</p> <p>?</p> <p>參考資料:<a href="http://www.golaravel.com/docs/4.1/introduction/">Laravel中文文檔</a></p> <p>?</p> <p>作者更多博客:<a href="http://www.cnblogs.com/huangbx/">Bowen Huang</a></p> <p>?</p> </div></div></div><div id="comment-wrapper-nid-548"></div><div class="field field-name-field-nuova-blogtag field-type-taxonomy-term-reference field-label-above"><div class="field-label">諾懷博客標(biāo)簽:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/blogtag/laravel" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Laravel</a></div><div class="field-item odd"><a href="/blogtag/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">PHP</a></div></div></div> Tue, 18 Mar 2014 02:11:45 +0000 Bowen Huang 548 at http://www.smt18.com http://www.smt18.com/blog/laravel%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83#comments