Bowen Huang的博客
http://www.smt18.com/blog/bowen-huang
zh-hans
-
Laravel學習筆記(六)數(shù)據(jù)庫填充
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ù)庫驅動的應用程序往往需要預先填充數(shù)據(jù)到數(shù)據(jù)庫,以便進行測試和演示。</p>
<p>?</p>
<h3><strong>什么是種子數(shù)據(jù)</strong></h3>
<p>?</p>
<p>種子數(shù)據(jù)就是必須要加載了應用程序才能正常運行的數(shù)據(jù)。大多數(shù)應用程序需要在開發(fā)、測試和生產(chǎn)中加載一些參考數(shù)據(jù)。</p>
<p>一般來說,這些數(shù)據(jù)不是用戶創(chuàng)建的,盡管我們可能一次一次的修改它們;我們的數(shù)據(jù)會依賴這些數(shù)據(jù)。</p>
<p>種子數(shù)據(jù)通常是不變的。一般來說,在應用程序中不可被編輯。但是,要求上它是可以被更改的,如果被更改了,種子數(shù)據(jù)需要被重新加載到部署的應用程序中。</p>
<p>理想的解決方案是自動化的:你沒必要去關心它。當你簽出代碼,啟動你的應用,他就準備好了。它應該提供數(shù)據(jù)完整性:創(chuàng)建的記錄應通過您的驗證。它應該很容易更新種子數(shù)據(jù)。</p>
<p>?</p>
<h3><strong>數(shù)據(jù)庫填充與遷移</strong></h3>
<p>?</p>
<p>在前幾節(jié)我們講到了數(shù)據(jù)遷移,數(shù)據(jù)遷移可以創(chuàng)建數(shù)據(jù)表的結構,其實,數(shù)據(jù)遷移也同樣可以插入數(shù)據(jù),需要創(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> php artisan migrate:make seed_authors_table </pre>
</div>
<p>運行如下:</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> <?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')->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' => 'Bowen',
<span style="color:rgb(0, 128, 128)">18</span> 'age' => 25,
<span style="color:rgb(0, 128, 128)">19</span> 'active'=> 1,
<span style="color:rgb(0, 128, 128)">20</span> 'email'=>'bowen@nova.com',
<span style="color:rgb(0, 128, 128)">21</span> 'bio' => '',
<span style="color:rgb(0, 128, 128)">22</span> 'role_id' => 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' => 'Judith',
<span style="color:rgb(0, 128, 128)">26</span> 'age' => 21,
<span style="color:rgb(0, 128, 128)">27</span> 'active'=>0,
<span style="color:rgb(0, 128, 128)">28</span> 'email'=>'judith@nova.com',
<span style="color:rgb(0, 128, 128)">29</span> 'bio' => '',
<span style="color:rgb(0, 128, 128)">30</span> 'role_id' => 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')->delete();
<span style="color:rgb(0, 128, 128)">43</span> }
<span style="color:rgb(0, 128, 128)">44</span> }</pre>
</div>
<p>運行該遷移文件如下:</p>
<p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121542372548664.png" style="border:0px" /></p>
<p>查看數(shù)據(jù)庫”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ù)庫遷移填充的壞處</strong></h3>
<p>?</p>
<p>雖然我們可以使用數(shù)據(jù)庫遷移的方式進行填充,但是這種方式有很多的缺點:</p>
<ul><li>如果執(zhí)行了遷移的回滾操作,那么我們添加的數(shù)據(jù)將會丟失;</li>
<li>更改數(shù)據(jù)比較麻煩</li>
</ul><p>?</p>
<h3><strong>Laravel數(shù)據(jù)庫填充(Seeder)</strong></h3>
<p>?</p>
<p>從4開始,artisan現(xiàn)在提供了一種巧妙的方式填充數(shù)據(jù)庫。遷移永遠不應該被應用于填充數(shù)據(jù)庫。數(shù)據(jù)填充使用artisan db:seed命令,來非常簡單的完成填充操作。</p>
<p>這個簡單的方式通過填充類使用測試數(shù)據(jù)填充您的數(shù)據(jù)庫。所有的填充類都存放在app/database/seeds?目錄下。填充類可以以形式命名,但最好遵循一些合理的約束,比如?UserTableSeeder等。默認情況下,一個?DatabaseSeeder?類以為您定義。在這個類中,您可以使用?call?函數(shù)運行其他填充類,允許您控制填充順序。</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> <?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' => 'Test1',
<span style="color:rgb(0, 128, 128)"> 8</span> 'age' => 25,
<span style="color:rgb(0, 128, 128)"> 9</span> 'active'=> 1,
<span style="color:rgb(0, 128, 128)">10</span> 'email'=>'test1@nova.com',
<span style="color:rgb(0, 128, 128)">11</span> 'bio' => '',
<span style="color:rgb(0, 128, 128)">12</span> 'role_id' => 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ù)庫中就會新加入一條記錄。</p>
<p>還有一種全局的執(zhí)行方法php artisan db:seed,可以執(zhí)行多個填充類。該方法是執(zhí)行的DatabaseSeeder這個類,我們編輯這個類:</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>->call('AuthorTableSeeder'); <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)">調用'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>->command->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ù)庫,將會回滾并重新運行所有遷移:然后執(zhí)行php artisan db:seed,這時同樣會成功添加數(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">諾懷博客標簽: </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學習筆記(五)創(chuàng)建數(shù)據(jù)結構,更新數(shù)據(jù)結構
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>默認假設</strong></h2>
<p>?</p>
<p>所有的列在定義的時候都有默認的假設,你可以根據(jù)需要重寫。</p>
<ul><li>Laravel假定每個表都有一個數(shù)值型的主鍵(通常命名為”id”),確保新加入的每一行都是唯一的。Laravel只有在每個表都有數(shù)值型主鍵時才會正常運行。所以,對于每一個Laravel應用,都要確保定義的主鍵使用的是increments()方法。</li>
<li>列在默認情況下為NOT NULL。</li>
</ul><p>現(xiàn)在,讓我們一行行分析結構生成器生成的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>->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>-><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>-><span style="color:rgb(0, 0, 255)">integer</span>('age')->nullable();
<span style="color:rgb(0, 128, 128)"> 6</span> <span style="color:rgb(128, 0, 128)">$table</span>-><span style="color:rgb(0, 0, 255)">boolean</span>('active')-><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>-><span style="color:rgb(0, 0, 255)">integer</span>('role_id')->unsigned();
<span style="color:rgb(0, 128, 128)"> 8</span> <span style="color:rgb(128, 0, 128)">$table</span>->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>->timestamps();</pre>
</div>
<p>實際上生成的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>我們會意識到,遷移是多么的強大,我們自需要記住一些結構生成器方法而不是寫晦澀難懂的SQL DDL代碼。</p>
<p>我們創(chuàng)建了表,那我們想要回滾的時候怎么辦呢?只需要在于up()方法對應的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>這個方法非常簡單,只有一行。它的全部作用就是刪除”authors”表,如果你熟悉sql,它等同于DROP TABLE authors。</p>
<p>現(xiàn)在,我們已經(jīng)寫好了架構,我們就可以對數(shù)據(jù)庫執(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>執(zhí)行結果如下:</p>
<p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121354540608470.png" style="border:0px" /></p>
<p>檢查數(shù)據(jù)庫,你會發(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>表結構如下:</p>
<p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121355201922722.png" style="border:0px" /></p>
<p>如果你要使用sql語句實現(xiàn)這張表,那么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> <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)在假設我們上次的執(zhí)行存在錯誤想要回滾,我們自需要使用artisan命令行工具執(zhí)行下面的命令即可:下一次,如果你想修改數(shù)據(jù)模型,你可以創(chuàng)建一個新的遷移,再次執(zhí)行命令artisan migrate。每一次執(zhí)行artisan migrate命令,它都會根據(jù)時間戳去檢查哪些沒有執(zhí)行,如果執(zhí)行了,就跳到下一個文件,如果沒有執(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>運行如下:</p>
<p><img alt="" src="http://images.cnitblog.com/i/431820/201403/121356563173922.png" style="border:0px" /></p>
<p>你會發(fā)現(xiàn),表”authors”已經(jīng)從數(shù)據(jù)庫中刪除了。</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>這時,表”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>運行結果如下:</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()方法,有兩個參數(shù):表名、閉包函數(shù)(在此函數(shù)內添加字段)。</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> -><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>有了添加方法,當然也需要添加回滾方法了,這里再次使用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> ->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)在運行artisan命令運行該遷移文件如下:</p>
<p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/121401112187046.png" style="border:0px" /></p>
<p>刷新數(shù)據(jù)庫表,你會發(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字段會從表中刪除。</p>
<p>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 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>用一個名稱創(chuàng)建的表。第二個參數(shù)是包含表定義的閉包。</p>
</td>
</tr><tr><td>
<p><code><strong>drop()</strong></code></p>
</td>
<td>
<p>可以通過<code>drop()</code>方法刪除表。刪除一個表同時會刪除它的所有列和任何索引。</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>刪除指定的列。請記住任何與該列關聯(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">諾懷博客標簽: </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學習筆記(四)數(shù)據(jù)庫遷移案例
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)建一個MySql數(shù)據(jù)庫“Laravel_db”。接下來打開app/config目錄下的database.php文件。請確保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' => 'mysql',</pre>
</div>
<p>然后輸入你的數(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> ...
<span style="color:rgb(0, 128, 128)"> 2</span> 'connections' => <span style="color:rgb(0, 0, 255)">array</span>(
<span style="color:rgb(0, 128, 128)"> 3</span> 'mysql' => <span style="color:rgb(0, 0, 255)">array</span>(
<span style="color:rgb(0, 128, 128)"> 4</span> 'driver' => 'mysql',
<span style="color:rgb(0, 128, 128)"> 5</span> 'host' => '127.0.0.1',
<span style="color:rgb(0, 128, 128)"> 6</span> 'database' => 'laravel_db', <span style="color:rgb(0, 128, 0)">//</span><span style="color:rgb(0, 128, 0)">數(shù)據(jù)庫名</span>
<span style="color:rgb(0, 128, 128)"> 7</span> 'username' => 'root, //你的數(shù)據(jù)庫用戶
<span style="color:rgb(0, 128, 128)"> 8</span> 'password' => 'Your_Database_Password', //數(shù)據(jù)庫登錄密碼
<span style="color:rgb(0, 128, 128)"> 9</span> 'charset' => 'utf8',
<span style="color:rgb(0, 128, 128)">10</span> 'collation' => 'utf8_unicode_ci',
<span style="color:rgb(0, 128, 128)">11</span> 'prefix' => '',
<span style="color:rgb(0, 128, 128)">12</span> ),
<span style="color:rgb(0, 128, 128)">13</span> ...</pre>
</div>
<p>我們要使用Laravel命令行工具artisan來創(chuàng)建我們新的遷移。要運行astisan需要打開一個終端,切換路徑到Laravel引用程序文件夾的更目錄。</p>
<p>第一個我們需要做的就是安裝migrations表,這樣Laravel就可以追蹤哪些遷移已經(jīng)運行了。下面的命令將會在數(shù)據(jù)庫中創(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> 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會返回“Migration table created successfully.”。</p>
<p>查看數(shù)據(jù)庫,你會發(fā)現(xiàn)artisan確實創(chuàng)建了一個新表“migrations”。</p>
<p><img alt="" src="http://images.cnitblog.com/i/431820/201403/120137412234652.png" style="border:0px" /></p>
<p>你不需要過于關注這個表。這只是一個幫助Laravel監(jiān)視遷移的表。當你添加新的遷移,artisan migrate會檢查migrations表并執(zhí)行那些沒有運行的遷移。</p>
<p>現(xiàn)在,讓我們創(chuàng)建一個實際的遷移文件。我想創(chuàng)建一個名為“author”的新表。讓我們運行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>運行截圖如下:</p>
<p>?<img alt="" src="http://images.cnitblog.com/i/431820/201403/120138078509818.png" style="border:0px" /></p>
<p>你會在app/database/migrations目錄下看到文件2014_03_11_162133_create_authors_table.php。</p>
<p>正如你看到的,一個新的遷移文件名稱中包含時間戳和遷移的描述性名稱。</p>
<p>[注]注意細節(jié)的讀者可能會注意到我們用“authors”問不是“author”命名作者表。這是Laravel設計理念的一方面,使用自然模型幫助我們存儲數(shù)據(jù)模型。Laravel的表應該始終命名為你的數(shù)據(jù)模型的復數(shù)形式。對于Author模型,表就被命名為“authors”。如果你有一個模型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)建的類必須至少包含類的兩個方法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> <?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ù)據(jù)模型的特定版本。Up()方法中的代碼執(zhí)行向前遷移,down()執(zhí)行反向遷移(創(chuàng)建數(shù)據(jù)庫的新版本或者回滾到前一個版本)。</p>
<p>很容易想到up()執(zhí)行遷移文件操作,down()是完全相反。就像word文檔中的撤銷命令——撤銷所做的修改。例如,我們想創(chuàng)建一個“authors”表,在up()中創(chuàng)建,在down()中撤銷。讓我們看看應該怎么做。</p>
<p>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 --table authors --create</pre>
</div>
<p>在上面的例子中,我們使用—table選項指定表名。另外,我添加了—create選項去告知artisan這個表需要被創(chuàng)建。如果我們打開遷移文件,你會發(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> <?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類來創(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>->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>-><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>-><span style="color:rgb(0, 0, 255)">integer</span>('age')->nullable();
<span style="color:rgb(0, 128, 128)">10</span> <span style="color:rgb(128, 0, 128)">$table</span>-><span style="color:rgb(0, 0, 255)">boolean</span>('active')-><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>-><span style="color:rgb(0, 0, 255)">integer</span>('role_id')->unsigned();
<span style="color:rgb(0, 128, 128)">12</span> <span style="color:rgb(128, 0, 128)">$table</span>->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>->timestamps();
<span style="color:rgb(0, 128, 128)">16</span> });
<span style="color:rgb(0, 128, 128)">17</span> }</pre>
</div>
<p>我們調用Schema::create()方法創(chuàng)建一個新表“authors”。Schema::create()方法有兩個參數(shù):表名和一個閉包,閉包中包含了列定義。</p>
<p>閉包中,我們可以使用$table參數(shù)創(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(128, 0, 128)">$table</span>->column_type(column_name)</pre>
</div>
<h2>?</h2>
<h2><span style="font-size:20px"><strong>列類型</strong></span></h2>
<p>?</p>
<p>在前面的示例中,我們指定的名稱列的類型為"string"。但這是什么意思?數(shù)據(jù)庫中通常沒有”string”類型的列。</p>
<p>請記住,Laravel 試圖使您的應用程序獨立于底層的數(shù)據(jù)庫;例如,如果你想,你可以使用 MySql 開發(fā)并部署到 Postgresql。如果您在遷移中使用 MySql 的列類型,應用到 Postgres 數(shù)據(jù)庫可能無法工作。所以,Laravel 遷移通過使用通用的數(shù)據(jù)類型使你與底層的數(shù)據(jù)庫類型系統(tǒng)隔離。如果我們要遷移 MySql 數(shù)據(jù)庫,?string()方法將創(chuàng)建VARCHAR(255)類型的列。在 Postgres,同一遷移可能會添加CHAR VARYING(255)類型的列 (雖然VARCHAR類型支持所有主要的數(shù)據(jù)庫平臺)。</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>向表中添加自動遞增的主鍵</p>
</td>
</tr><tr><td>
<p><strong>string($column)</strong></p>
</td>
<td>
<p>添加一個VARCHAR(255)列</p>
</td>
</tr><tr><td>
<p><strong>string($column, $length)</strong></p>
</td>
<td>
<p>添加具有長度的VARCHAR</p>
</td>
</tr><tr><td>
<p><strong>integer($column)</strong></p>
</td>
<td>
<p>向表中添加一個INTEGER列,</p>
</td>
</tr><tr><td>
<p><strong>float($column)</strong></p>
</td>
<td>
<p>向表中添加一個FLOAT的列</p>
</td>
</tr><tr><td>
<p><strong>decimal($column, $precision, $scale)</strong></p>
</td>
<td>
<p>添加一個DECIMAL列的精度和小數(shù)位數(shù)。精度是總數(shù)中數(shù)字的位數(shù)。規(guī)模是小數(shù)點的右側的位數(shù)。例如,數(shù) 123.45 具有精度為 5 和 2 的小數(shù)。從邏輯上講,規(guī)模不能大于精度。</p>
</td>
</tr><tr><td>
<p><strong>boolean($column)</strong></p>
</td>
<td>
<p>向表中添加一個BOOLEAN的列。注意: 存儲布爾值的方式而有所不同從一個數(shù)據(jù)庫到另一個數(shù)據(jù)庫。一些使用"1"和"0"的整數(shù)值來表示 true 和 false,個別的,其他人使用"T"和"F"等字符。Laravel 的"boolean"類型映射到數(shù)據(jù)庫的所有系統(tǒng)上的small integer列。Laravel 很好的處理 PHP 的true與false之間的映射,所以你不需要擔心。</p>
</td>
</tr><tr><td>
<p><strong>text($column)</strong></p>
</td>
<td>
<p>相當于表的TEXT</p>
</td>
</tr><tr><td>
<p><strong>blob($column)</strong></p>
</td>
<td>
<p>相當于表的BLOB</p>
</td>
</tr><tr><td>
<p><strong>binary($column)</strong></p>
</td>
<td>
<p>相當于表的BINARY</p>
</td>
</tr><tr><td>
<p><strong>dateTime($column)</strong></p>
</td>
<td>
<p>相當于表DATETIME</p>
</td>
</tr><tr><td>
<p><strong>timestamp($column)</strong></p>
</td>
<td>
<p>相當于表TIMESTAMP</p>
</td>
</tr><tr><td>
<p><strong>date($column)</strong></p>
</td>
<td>
<p>相當于表的DATE</p>
</td>
</tr><tr><td>
<p><strong>time($column)</strong></p>
</td>
<td>
<p>相當于表的TIME</p>
</td>
</tr><tr><td>
<p><strong>enum($column, array $allowed)</strong></p>
</td>
<td>
<p>在表上創(chuàng)建一個新的ENUM列</p>
</td>
</tr></tbody></table><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"><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()不同。它是一個 Laravel 用來管理創(chuàng)建和修改作為created_at和updated_at?TIMESTAMP列的便利方法。他們是 Laravel 可以自己修改的兩個特殊的數(shù)據(jù)庫列。created_at列為僅當行被創(chuàng)建時當前時間戳。另一方面,?updated_at被修改為每次操作的行的數(shù)據(jù)時當前時間戳。</p>
</td>
</tr><tr><td>
<p><strong>nullable()</strong></p>
</td>
<td>
<p>將指定列允許NULL值。默認情況下,Laravel 使在數(shù)據(jù)庫級別需要通過添加NOT NULL約束的列。</p>
</td>
</tr><tr><td>
<p><strong>default($value)</strong></p>
</td>
<td>
<p>設置要用于新行作為初始值的列的默認值。你永遠不需要顯式設置的默認值為 null。不設置它默認值就為null。</p>
</td>
</tr><tr><td>
<p><strong>unsigned()</strong></p>
</td>
<td>
<p>設置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">諾懷博客標簽: </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學習筆記(三)數(shù)據(jù)庫遷移介紹
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é)內容翻譯自《</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">》,一切版權為原作者。</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鼓勵敏捷、迭代的開發(fā)方式,我們沒指望在第一次就獲得所有正確的。相反,我們編寫代碼、測試和與我們的最終用戶進行交互,并完善我們的理解。</p>
<p>對于工作,我們需要一個配套的實踐集。我們使用像subversion、GIT或Mercurial這些版本控制工具來存儲應用程序的源代碼文件,使我們能夠撤消錯誤和追蹤開發(fā)過程中的改變。</p>
<p>但應用程序更改時,存在我們不能單獨使用版本控制進行有效管理的區(qū)域。在我們的開發(fā)進度中,Laravel應用程序的數(shù)據(jù)庫架構不斷演變:我們在這里添加了一個表,在那里重命名列,刪除索引等等。數(shù)據(jù)庫的改變與應用程序代碼步調一致。</p>
<p>你需要一個復雜的方法來跟蹤您的數(shù)據(jù)庫架構更改,通常有幾種方法:</p>
<ul><li>當您在開發(fā)團隊內工作時,每人都需要知道關于任何架構的更改。</li>
<li>當你在生產(chǎn)服務器上部署時,您需要有穩(wěn)健的方式來升級您的數(shù)據(jù)庫架構。</li>
<li>如果您在多臺機器上工作,你需要保持所有數(shù)據(jù)庫架構的同步。</li>
</ul><p>如果沒有嚴格的約定和紀律讓應用程序開發(fā)者遵循,保持數(shù)據(jù)庫架構與應用程序代碼同步歷來是一個非常麻煩的工作。開發(fā)者(或數(shù)據(jù)庫管理員) 進行所需的架構更改。但是,如果應用程序代碼回滾到以前的版本,但是很難撤消數(shù)據(jù)庫架構更改,照成數(shù)據(jù)庫版本信息與應用程序代碼版本信息不一致。</p>
<p>遷移就是幫助你進化你的應用程序數(shù)據(jù)架構的Laravel方式,它不需要你在每次改變的時候刪除或者重建數(shù)據(jù)庫。沒有刪除和重建就意味著你不會在每次改變的時候丟失數(shù)據(jù)。當你執(zhí)行遷移時唯一的改變就是將數(shù)據(jù)庫架構從一個版本移到另一個版本,不管是向前還是向后移。</p>
<p>Laravel遷移給你提供了一種在迭代方式中修改數(shù)據(jù)庫架構的手段,它不要你用SQL操作,而是允許你使用PHP代碼。Laravel架構生成器允許我們快速創(chuàng)建數(shù)據(jù)庫表和插入列或索引。它使用清潔和富有表現(xiàn)力的語法來操作數(shù)據(jù)庫。你也許為認為Laravel遷移就是數(shù)據(jù)庫的版本控制。</p>
<p>通過定義一個更高級別的接口來創(chuàng)建和維護數(shù)據(jù)庫架構,你可以用與數(shù)據(jù)庫無關的方式定義它。通過使用 PHP 來創(chuàng)建表,定義列和索引,寫一次架構并將其應用到任何所支持的數(shù)據(jù)庫后端。額外的好處是 ,Laravel 跟蹤已經(jīng)應用了哪些遷移和哪些仍需要應用。</p>
<p>?</p>
<h2><strong>遷移基礎知識</strong></h2>
<p>?</p>
<p>一個Laravel遷移僅僅是你應用程序app/database/migrations目錄下的PHP源文件。每個文件都包含了對底層數(shù)據(jù)庫的一組改變。對數(shù)據(jù)庫的改變是在PHP代碼中而不是數(shù)據(jù)庫特定的SQL。你的PHP遷移代碼最終被轉換成符合你當前數(shù)據(jù)庫的DDL,這使得切換數(shù)據(jù)庫平臺非常的容易。由于遷移代碼保存在自己的目錄中,就務必要像其他的項目代碼一樣包含到版本控制里面。Laravel遷移是使用Artisan工具用命令行顯示運行的。</p>
<p>?</p>
<h2><strong>遷移文件命名約定</strong></h2>
<p>?</p>
<p>在舊版本Laravel的,遷移的文件有比較簡單的名字,如001_create_employees_table.php 。 Laravel 3(Laravel 4.1和其相同)帶來了新的命名約定,其中名稱的第一部分從一個序列號變更為更長的時間,像2014_03_11_032903_create_employees_table.php。該文件的名稱的形式YYYY_MM_DD_HHMMSS_some_meaningful_name.php的,也就是說一個UTC時間戳識別后跟一個遷移名。</p>
<p>新的更寬的名字有助于避免名稱沖突,如果你是工作在一個團隊里的一個開發(fā)人員,你可以檢查自己的遷移。</p>
<p>此外, Laravel遷移文件的時間戳,以便他們可以順序執(zhí)行。時間戳數(shù)字是遷移的關鍵,因為它們定義了哪一個遷移應用在獨立遷移版本號的順序。</p>
<p>想SQL腳本,遷移從頂部開始執(zhí)行,這更加需要這些文件才能被執(zhí)行。順序執(zhí)行移除了類似這樣的可能性——在表不存在的時候嘗試插入列。</p>
<p>盡管你可以手動創(chuàng)建遷移文件,但是使用Artisan工具生成遷移腳本更加的容易(并且不易出錯)。你可以根據(jù)需要在以后編輯這些文件。</p>
<h3>運行遷移Forward 和 Backward</h3>
<p>使用Artisan工具遷移到數(shù)據(jù)庫。Laravel提供了一套artisan任務,可以歸結為運行特定的幾套遷移。</p>
<p><strong>[</strong><strong>注]</strong><strong>你可以運行artisan list</strong><strong>同查看artisan</strong><strong>支持的任務列表,大多數(shù)數(shù)據(jù)遷移相關的任務都帶有前綴migrate:</strong><strong>。</strong></p>
<p>只有幾個你需要知道的常見任務:</p>
<ul><li>migrate:install<br />
你第一次使用的與遷移有關的artisan任務可能就是migrate:install。在內部,Laravel使用特殊的表來跟蹤哪些遷移已經(jīng)運行。若要創(chuàng)建此表,只需要用artisan命令行工具:<br />
$php artisan migrate:install</li>
<li>migrate<br />
你將會運行migrate任務頻繁的更新你的數(shù)據(jù)庫,以支持你添加到應用程序中的最新的表和列。最基本的形式,它只會對那些所有沒有被運行過的遷移運行up()方法。如果沒有這樣的遷移,會退出。它將基于遷移的日期來運行這些遷移。</li>
<li>migrate:rollback<br />
在寫遷移時偶爾也會犯錯誤。如果你已經(jīng)運行了遷移,那么你不能只是編輯遷移和再次運行遷移:Laravel假定它已經(jīng)運行了遷移,那么當你再次運行artisan migrate,不會做任何事情。你必須使用artisan migrate:rollback回滾遷移,然后編輯遷移,再運行artisan migrate去運行正確的版本。</li>
</ul><p>一般情況下,編輯現(xiàn)有的遷移不是好主意:你和你的同事將會需要額外的工作,并且這是一件讓人頭痛的事——如果現(xiàn)存版本的遷移已經(jīng)運行在生產(chǎn)機器上。相反,你需要寫一個新的遷移去執(zhí)行所需的改變。</p>
<p><strong>[注]artisan migrate:rollback 會刪除上次的遷移應用。Laravel回滾整個遷移“操作”。因此,如果上次的遷移命令運行了15個遷移,這15個遷移都會被回滾。請注意,當你刪除列或者表,會丟失數(shù)據(jù)。</strong></p>
<ul><li>migrate:reset<br />
回滾所有的遷移(會刪掉所有表和數(shù)據(jù))</li>
<li>migrate:refresh<br />
artisan migrate:refresh任務將刪除數(shù)據(jù)庫、 重新創(chuàng)建它并將加載當前架構。這是一個方便快捷方式去運行重置并隨后重新運行所有遷移。</li>
<li>migrate:make<br />
artisan migrate:make命令告訴 Laravel 來生成一個遷移文件骨架 (這是實際上是一個 PHP 文件) ,存放到app/database/migrations文件夾中。然后,您可以編輯此文件來充實您的表/索引定義。然后,artisan migrate命令運行時,artisan會查詢此文件來生成 SQL DDL 的實際代碼。</li>
</ul><p>?</p>
<p>接下來會詳細描述數(shù)據(jù)庫遷移</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">諾懷博客標簽: </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學習筆記(二)Laravel 應用程序的體系結構
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)境就緒了,當然就要開始了解框架了。</span></h2>
<p>站在巨人的肩膀上,學東西會事半功倍。我在網(wǎng)上找到一篇好文章,正好可以讓我輕松了解Laravel應用程序的體系結構。因此借來直接用了。</p>
<p>該章節(jié)內容翻譯自<a href="http://laravelbook.com/laravel-architecture/">《Architecture of Laravel Applications》</a>,一切版權為原作者,由于原作者寫這篇文章時Laravel版本還沒有到4.1,一些地方有稍微差別,我會稍作修改。</p>
<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被稱為“全棧”式框架,因為它處理從網(wǎng)絡服務到數(shù)據(jù)庫管理,直到HTML生成的一切事情,一個垂直集成的web開發(fā)環(huán)境能給開發(fā)者提供更好的體驗。</p>
<p>一個典型的程序員通過命令行工具與Laravel交互,生成和管理Laravel項目環(huán)境。Laravel帶有一個名為Artisan的優(yōu)秀的命令行工具,可以用它來生成框架代碼和數(shù)據(jù)庫架構,Artisan能夠處理從數(shù)據(jù)庫架構遷移到資源和配置管理的一切事情。</p>
<p>?</p>
<h2><strong>約定優(yōu)于配置</strong></h2>
<p>?</p>
<p>Laravel 的有趣的特征之一,在如何構建 web 應用程序上它規(guī)定了一些相當嚴重的限制。出人意料的是,這些限制使創(chuàng)建應用更加的容易——輕松了很多。讓我們來看看為什么。</p>
<p>Laravel區(qū)別于其他垂直集成開發(fā)環(huán)境在于它強烈的偏好約定優(yōu)于配置。而一些 Java,Python 或 PHP 框架往往需要大量的 XML 配置,Laravel在開始的時候幾乎不需要配置(也許只有幾行在PHP中)。這種對配置文件的規(guī)避行為使其非常獨特,在所有 Laravel 應用程序中可識別的代碼結構是相同的。</p>
<p>?</p>
<h2><strong>一個項目結構來統(tǒng)治他們所有 !</strong></h2>
<p>?</p>
<p>這并不奇怪,所有Laravel項目基本上具有相同的目錄結構 ——在其中的每個文件都有其指定的地方。通過這種約定的目錄結果,可以確保開發(fā)者按照“Laravel way”工作。</p>
<p>圖 1.1 顯示了 Laravel 項目目錄結構是什么樣子:</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 項目目錄結構</p>
<p>就如你看到這樣,laravel下面只包含了4個文件夾,這4個文件夾下面有一些子文件夾,這種豐富的子文件夾在第一次看到是不是有壓力?我會逐個介紹。我們大部分的開發(fā)工作都會在app/文件夾下面進行。</p>
<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><strong>頂級文件夾</strong></p>
</td>
<td>
<p><strong>作用</strong></p>
</td>
</tr><tr><td>
<p><strong>app</strong></p>
</td>
<td>
<p>包含了站點的controllers(控制器),models(模型),views(視圖)和assets(資源)。這些是網(wǎng)站運行的主要代碼,你會將你大部分的時間花在這些上面。</p>
</td>
</tr><tr><td>
<p><strong>bootstrap</strong></p>
</td>
<td>
<p>用來存放系統(tǒng)啟動時需要的文件,這些文件會被如index.php這樣的文件調用。</p>
</td>
</tr><tr><td>
<p><strong>public</strong></p>
</td>
<td>
<p>這個文件夾是唯一外界可以看到的,是必須指向你web服務器的目錄。它含有l(wèi)aravel框架核心的引導文件index.php,這個目錄也可用來存放任何可以公開的靜態(tài)資源,如css,Javascript,images等。</p>
</td>
</tr><tr><td>
<p><strong>vendor</strong></p>
</td>
<td>
<p>用來存放所有的第三方代碼,在一個典型的Laravel應用程序,這包括Laravel源代碼及其相關,并含有額外的預包裝功能的插件。</p>
</td>
</tr></tbody></table><p>?</p>
<p>正如上面提到的,/app是所有的樂趣產(chǎn)生的地方,讓我們更深入的看看這個目錄的結構。</p>
<p>圖 1.2 顯示/app文件夾的詳細信息:</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 文件夾詳細信息</p>
<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><strong>文件的文件夾</strong></p>
</td>
<td>
<p><strong>作用</strong></p>
</td>
</tr><tr><td>
<p><strong>/app/config/</strong></p>
</td>
<td>
<p>配置應用程序的運行時規(guī)則、 數(shù)據(jù)庫、 session等等。包含大量的用來更改框架的各個方面的配置文件。大部分的配置文件中返回的選項關聯(lián)PHP數(shù)組。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/app.php</strong></p>
</td>
<td>
<p>各種應用程序級設置,即時區(qū)、 區(qū)域設置(語言環(huán)境)、 調試模式和獨特的加密密鑰。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/auth.php</strong></p>
</td>
<td>
<p>控制在應用程序中如何進行身份驗證,即身份驗證驅動程序。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/cache.php</strong></p>
</td>
<td>
<p>如果應用程序利用緩存來加快響應時間,要在此配置該功能。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/compile.php</strong></p>
</td>
<td>
<p>在此處可以指定一些額外類,去包含由‘a(chǎn)rtisan optimize’命令聲稱的編譯文件。這些應該是被包括在基本上每個請求到應用程序中的類。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/database.php</strong></p>
</td>
<td>
<p>包含數(shù)據(jù)庫的相關配置信息,即默認數(shù)據(jù)庫引擎和連接信息。</p>
</td>
</tr><tr><td>
<p><strong>/app/config/mail.php</strong></p>
</td>
<td>
<p>為電子郵件發(fā)件引擎的配置文件,即 SMTP 服務器,F(xiàn)rom:標頭</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)的雜項配置。</p>
</td>
</tr><tr><td>
<p><strong>/app/controllers</strong></p>
</td>
<td>
<p>包含用于提供基本的邏輯、 數(shù)據(jù)模型交互以及加載應用程序的視圖文件的控制器類。</p>
</td>
</tr><tr><td>
<p><strong>/app/database/migrations/</strong></p>
</td>
<td>
<p>包含一些 PHP 類,允許 Laravel更新當前數(shù)據(jù)庫的架構并同時保持所有版本的數(shù)據(jù)庫的同步。遷移文件是使用Artisan工具生成的。</p>
</td>
</tr><tr><td>
<p><strong>/app/database/seeds/</strong></p>
</td>
<td>
<p>包含允許Artisan工具用關系數(shù)據(jù)來填充數(shù)據(jù)庫表的 PHP 文件。</p>
</td>
</tr><tr><td>
<p><strong>/app/lang/</strong></p>
</td>
<td>
<p>PHP 文件,其中包含使應用程序易于本地化的字符串的數(shù)組。默認情況下目錄包含英語語言的分頁和表單驗證的語言行。</p>
</td>
</tr><tr><td>
<p><strong>/app/models/</strong></p>
</td>
<td>
<p>模型是代表應用程序的信息(數(shù)據(jù))和操作數(shù)據(jù)的規(guī)則的一些類。在大多數(shù)情況下,數(shù)據(jù)庫中的每個表將對應應用中的一個模型。應用程序業(yè)務邏輯的大部分將集中在模型中。</p>
</td>
</tr><tr><td>
<p><strong>/app/start/</strong></p>
</td>
<td>
<p>包含與Artisan工具以及全球和本地上下文相關的自定義設置。</p>
</td>
</tr><tr><td>
<p><strong>/app/storage/</strong></p>
</td>
<td>
<p>該目錄存儲Laravel各種服務的臨時文件,如session, cache,? compiled view templates。這個目錄在web服務器上必須是可以寫入的。該目錄由Laravel維護,我們可以不關心。</p>
</td>
</tr><tr><td>
<p><strong>/app/tests/</strong></p>
</td>
<td>
<p>該文件夾給你提供了一個方便的位置,用來做單元測試。如果你使用PHPUnit,你可以使用Artisan工具一次執(zhí)行所有的測試。</p>
</td>
</tr><tr><td>
<p><strong>/app/views/</strong></p>
</td>
<td>
<p>該文件夾包含了控制器或者路由使用的HTML模版。請注意,這個文件夾下你只能放置模版文件。其他的靜態(tài)資源文件如css, javascript和images文件應該放在/public文件夾下。</p>
</td>
</tr><tr><td>
<p><strong>/app/routes.php</strong></p>
</td>
<td>
<p>這是您的應用程序的路由文件,其中包含路由規(guī)則,告訴 Laravel 如何將傳入的請求連接到路由處理的閉包函數(shù)、 控制器和操作。該文件還包含幾個事件聲明,包括錯誤頁的,可以用于定義視圖的composers。</p>
</td>
</tr><tr><td>
<p><strong>/app/filters.php</strong></p>
</td>
<td>
<p>此文件包含各種應用程序和路由篩選方法,用來改變您的應用程序的結果。Laravel 具有訪問控制和 XSS 保護的一些預定義篩選器。</p>
</td>
</tr></tbody></table><p>花了很多心思在建立和命名文件夾上,得到的就是一個具有良好的文件系統(tǒng)的應用程序。</p>
<p>在這里你得到了什么:MVC</p>
<p>?</p>
<h2><strong>模型-視圖-控制器(MVC)</strong></h2>
<p>?</p>
<p>讓我們進入Laravel應用工作的高級別概述。你可能已經(jīng)注意到了標準的Laravel應用程序結構由一個應用程序目錄app/,它含有三個子目錄:models/,views/和controllers/。這就透露了Laravel遵循model-view-controller(MVC)架構模式,就是強制將輸入到展示邏輯關系的“業(yè)務邏輯”與圖形用戶界面(GUI)分開。就Laravel web應用而言,業(yè)務邏輯通常由像用戶,博客文章這樣的數(shù)據(jù)模型組成。GUI只是瀏覽器中的網(wǎng)頁而已。MVC設計模式在網(wǎng)頁開發(fā)領域很流行。</p>
<p>MVC模式的3個組件:</p>
<ul><li>模型(model)</li>
<li>視圖(view)</li>
<li>控制器(controller)</li>
</ul><p>[注] 原作者在這里詳細介紹了MVC三個組成部分,我這里由于篇幅就不介紹了。</p>
<p>?</p>
<h2><strong>Laravel組件</strong></h2>
<p>?</p>
<p>一個典型的Laravel應用程序包含上面提到的MVC組件,如下圖:</p>
<p class="rtecenter">?<img alt="" src="http://images.cnitblog.com/i/431820/201403/071626088464369.png" style="border:0px" /></p>
<p>當與Laravel交互時,瀏覽器發(fā)送一個請求,web服務器接收到請求并且傳給Laravel路由引擎。Laravel路由接收到請求,然后重定向給基于路由的URL模式的合適的控制器類方法。</p>
<p>然后控制器類接管。在某種情況下,控制器會立即呈現(xiàn)出一個視圖,它是一個被轉換成HTML并送回瀏覽器的模版。更常見的動態(tài)網(wǎng)站,控制器與模型交互,這是一個PHP對象,它表示應用程序(如用戶、博客文章)中的一個元素,并負責與數(shù)據(jù)庫進行通信的。調用模型后,控制器則呈現(xiàn)最終視圖( HTML,CSS和圖像),并返回完整的網(wǎng)頁到用戶的瀏覽器。</p>
<p>Laravel促進了這樣的概念——模型、視圖和控制器,應通過存儲這些元素在不同的目錄中的單獨的代碼文件中來保持相當?shù)莫毩⑿?。這就是Laravel目錄結構發(fā)揮了作用。</p>
<p>像MVC這樣的設計模式的產(chǎn)生,就是為了讓開發(fā)者的生活更加的輕松。這就是Laravel比那些不用任何模式的PHP厲害的地方。如果這種討論很抽象,現(xiàn)在,不用擔心!當你開始Laravel工作,你都不會意識到你是在一種設計模式中工作。過一段時間后,就會變得自然了。</p>
<p>?</p>
<h2><strong>數(shù)據(jù)模型</strong></h2>
<p>?</p>
<p>數(shù)據(jù)模型是任何應用程序的基礎,它描述了應用程序的業(yè)務邏輯。任何一塊的數(shù)據(jù)都是用數(shù)據(jù)庫表來表示的。Laravel提供了一些技術來簡化對數(shù)據(jù)庫的訪問。</p>
<p>Laravel通過將數(shù)據(jù)庫中的表行轉成能被輕松操縱的PHP對象,來連接應用程序的數(shù)據(jù)模型和數(shù)據(jù)庫表。它還使您能夠執(zhí)行業(yè)務規(guī)則,描述在應用程序中不同的數(shù)據(jù)模型之間的關系等。例如,一個人的家庭關系可以用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>->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>->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>->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>->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>->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>如果翻譯有什么錯誤,歡迎指出來。</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">諾懷博客標簽: </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學習筆記(一)安裝配置開發(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的目標是給開發(fā)者創(chuàng)造一個愉快的開發(fā)過程,并且不犧牲應用的功能性??鞓返拈_發(fā)者才能創(chuàng)造最棒的代碼!為了這個目的,開發(fā)者博取眾框架之長處集中到Laravel中,這些框架甚至是基于Ruby on Rails、ASP.NET MVC、和Sinatra等開發(fā)語言或工具的。</p>
<p>?</p>
<h1>對Laravel初步認知</h1>
<p>?</p>
<p>剛從事PHP開發(fā)沒多久,對PHP的一些框架了解甚少,在CSDN上看到一篇文章<a href="http://www.csdn.net/article/2014-01-03/2818006-PHP-framework-Laravel">《PHP開發(fā)框架流行度排名:Laravel居首》</a>,才知道還有Laravel這么個框架,正好<a href="http://www.smt18.com/">公司</a>想從事Laravel的開發(fā),就學習一下。然后搜索了大量的資料,了解到了它是什么。</p>
<p>至于它的詳細介紹我就不說了,google一下,就有了。</p>
<p>?</p>
<h1>Laravel環(huán)境搭建</h1>
<p>?</p>
<p>在有了初步認知后,當然就要開始在自己的電腦上搭建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)境的,請到下面地址下載:<a href="http://cn2.php.net/downloads.php">http://cn2.php.net/downloads.php</a></li>
<li>電腦上具有web服務器,IIS,apache或者其它web服務器</li>
<li>MCrypt PHP擴展</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>)來管理代碼依賴性。Windows操作系統(tǒng)中,你可以使用Composer的<a href="https://getcomposer.org/Composer-Setup.exe" target="_blank">Windows安裝工具</a>。下載后直接安裝就可以了,安裝之后,可以在控制臺輸入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>控制臺進入該目錄(Laravel_site),執(zhí)行命令composer install,然后程序會下載必要安裝文件,要保證網(wǎng)絡暢通<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>然后觀察文件目錄下,多了一個vendor文件夾,composer.lock文件也被修改了。</li>
</ul><p>當然還有一種安裝方式,就是直接下載完整安裝包,解壓即可,下載地址:<a href="http://ci.laravel-cn.com/laravel.zip">http://ci.laravel-cn.com/laravel.zip</a></p>
<p>?</p>
<h2>服務器配置</h2>
<p>?</p>
<p>在上面的操作完成后,就是配置該站點在web服務器上,我相信這些操作,只要有過網(wǎng)站開發(fā)經(jīng)驗的人都有,我就不詳細介紹了。這里要注意一點的就是,配置網(wǎng)站的時候,根目錄是public,為不是最Laravel_site,配置好了,運行如下:</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">諾懷博客標簽: </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