公司導入 Laravel 分享 - 5. 資料庫

一、設定

在 config/database.php 檔案裡會看到很多不同的資料庫連線資訊。
'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],
如果是要配合我們公司的系統資料庫,這裡要將編碼改成 utf8,因為公司的系統資料庫不支援 utf8mb4。
在 config/database.php 裡頭有看到一些寫著類似 env('DB_HOST', '127.0.0.1') 的語法,之前也有說過 env 會去抓網站的環境設定檔 .env 裡面的值,如果沒有的話就帶後面的預設值,所以我們需要在 .env 檔裡面去設定資料庫的相關資訊。
一般來說 .env 這個檔案不會進版本控制系統。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_web_database
DB_USERNAME=root
DB_PASSWORD=12345678

二、Migration

這是一個資料庫版本控制的機制,只針對「結構」的部分,而不是「資料」的部分。

1. 建立 migration

php artisan make:migration create_posts_table --create=post
這時我們可以在 /database/migrations 看到 2017_05_08_080254_create_posts_table.php 這樣子的檔案。
up() 是版本發布時會 run 的指令,down() 則是還原時會 run 的指令。
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
中間內容的部分這裡只列出幾種常見的,其他詳細內容請自行參考:https://laravel.com/docs/5.4/migrations#tables
語法 說明
$table->increments('id'); 一個遞增的 id 欄位(主鍵)
$table->string('title'); VARCHAR
$table->text('content'); TEXT
$table->integer('votes'); INT
$table->timestamps(); 會變成兩個 TIMESTAMP 欄位,分別是 created_at 和 updated_at

2. 執行 migration

php artisan migrate
第一次執行之後會在資料庫中建立一個 migrations 資料表來記錄版本。

3. 還原 migration

php artisan migrate:rollback

三、Query Builder

這裡列出一些常用的,主要是針對查詢的部分說明,還有很多這裡沒有列,如果需要請查詢:https://laravel.com/docs/5.4/queries

1. 取得結果

get() 是取得結果的方法,例如:
Post::where('id', '>', 3)->get()
如果不需要其他 sql 語法單純的取得整張資料表的資料也可以用 all(),例如:
Post::all();
如果是要第一筆資料也可以使用 first(),例如:
Post::where('id', '>', 3)->first();
另外,也可以使用 count、max、min、avg、sum 取得結果。
$price = Order::where('finalized', 1)->avg('price');

2. select

select 是 select 欄位。
$posts = Post::select('title', 'content as post_content')->get();

3. join

inner join

$posts = Post::join('categories', 'posts.category_id', '=', 'categories.id')->get();

left join

$posts = Post::leftJoin('categories', 'posts.category_id', '=', 'categories.id')->get();

4. where

$posts = Post::where('id', 5)->get();
取得 id = 5 的文章。
$posts = Post::where('id', '>', 5)->get();
取得 id > 5 的文章。
$posts = Post::where('title', 'like', "%學測%")->get();
取得標題有「學測」的文章。

5. 排序

$posts = Post::where('id', '>', 5)->orderBy('id', 'desc')->get();

6. Group

$posts = Post::where('id', '>', 5)->groupBy('user_id')->get();

7. 其他

如果這些都沒辦法組成我們想要的 SQL,這時我們可以使用 DB::raw('這裡放語法') 來達成。

四、分頁

一頁 15 筆資料
$posts = Post::where('title', 'like', "%學測%")->paginate(15);

1. 顯示

<div class="container">
    @foreach ($posts as $post)
        {{ $post->title }}
    @endforeach
</div>

{{ $posts->links() }}
如果我們有其他的查詢條件
{{ $posts->appends(['title' => '學測'])->links() }}

留言