iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 10

[Day 10] 存取資料庫內容!來談 Eloquent Model

知道怎麼建立資料庫,並修改資料庫格式了。再來就是存取囉!

說到存取資料庫,就勢必會碰觸到 Laravel 另一個核心的物件:Eloquent Model!

什麼是 Eloquent Model

Eloquent Model 是 Laravel 裡面用來存取資料庫的一組類別,實作了 Active Record 的架構。

實作需求

我們來做一個簡單的留言板作為練習。這個留言板的結構如下:

  • 用戶可以上來留言(不記名)
  • 每篇留言除了內容以外,可以從「中國名言」,「歐美名言」,「日本名言」裡面,選一個對應的主題

這需求會需要兩個不同的物件,Post 處理留言,對應資料表 posts

資料表欄位名稱 資料欄位內容
id 資料 id
content 留言內容
created_at 資料建立時間
updated_at 資料編輯時間

Subject 處理主題,對應資料表 subjects

資料表欄位名稱 資料欄位內容
id 資料 id
name 主題名稱
created_at 資料建立時間
updated_at 資料編輯時間

這邊要注意一下,物件的名稱是單數,然後對應資料表的名稱,必須是該物件的複數。

所以,假設你有個物件叫做 Child,對應的資料表名稱就會是 children

(考考大家,如果有個物件名稱是 Cactus,那麼資料表名稱是⋯⋯?請留言回答~)

建立 posts 資料表

$ php artisan make:migration create_posts_table
Created Migration: 2019_09_12_025314_create_posts_table

建立完成囉!接著跟之前的步驟一樣,我們加入 content 作為主題名稱

<?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->bigIncrements('id');
            $table->string('content', 255);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

建立 Post 物件

建立物件的方式,相信類似的套路看到這裡,聰明的讀者也都猜得出來了:

$ php artisan make:model Post 
Model created successfully.

進去 app/Post.php,看看範例的程式碼長怎樣:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

這邊,我們需要宣告一下資料表裡面有哪些可以用的欄位,不然 Laravel 是不知道的。

我們參考官方的 User 物件,加入 $fillable 這個變數來改寫:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'content'
    ];
}

好啦!這樣就完成了

建立主題資料表和物件

針對主題資料表和物件這邊,我們換個方式來處理!

$ php artisan make:model Subject --migration
Model created successfully.
Created Migration: 2019_09_11_010732_create_subjects_table

我們在指令裡面加上 --migration,這樣一來,我們就可以一次建立好物件和資料表囉!而且你就不需要自己去考慮物件跟資料表之間單複數的關係了,很方便吧!

這個物件的結構和 Post 一樣,都是多加一個字串。不過不同的是,多加的名稱是 name 而不是 content

裡面填入的內容就交給大家嚐試看看囉!

存取物件

接著,我們來存取這兩個物件。我們做一個測試路徑 /test/ 來存取 Post

Route::get('/test', function(){
    return App\Post::all();
});

然後連線看看

sql refuse connection

咦?怎麼回事?我們不是已經成功的和資料庫連線過了嗎?為什麼網站連線不上?

這是因為我們使用了 docker,對開發機的環境設置來說,連線 127.0.0.1 是合理的,但是對於運作 Laravel 程式的 docker container 來說,這樣連線環境設置是錯誤的,所以會導致連線失敗。

我們必須將 .envDB_HOST 改成

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

然後,我們再連線看看,應該就可以看到 [ ] 了!

如果我們在資料庫裡面加入一些內容

db data

然後,網頁應該要顯示

[
    {
    id: 1,
    content: "Laravel 6.0 tutorial",
    created_at: null,
    updated_at: null
    }
]

我們成功地在網頁存取資料庫內容囉!


最後總結一下今天我們學到的東西

我們學到該怎麼建立 Eloquent Model,並在網頁上存取裡面的內容。

希望各位覺得這篇文章有學到東西!我們明天見!


上一篇
[Day 9] 建立資料庫!Laravel 怎麼做資料庫遷移
下一篇
[Day 11] 物件該怎麼使用!聊 Model 的 BREAD
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
Lucas Yang
iT邦新手 4 級 ‧ 2019-09-12 13:52:59

Cactus 的資料表名稱是 cacti

0
Nighteye1228
iT邦新手 5 級 ‧ 2019-09-17 11:25:20

想問一下如果HOST改成mysql之後,就沒辦法migrate資料表,改回去127.0.0.1又可以,有沒有什麼辦法可以不用這樣改來改去的呢?

ReccaChao iT邦新手 1 級 ‧ 2019-09-17 22:55:55 檢舉

有的!就是在 laradock_workspace_1 這個 container 裡面執行 migrate 操作。

先運行

$ docker exec -it --user=laradock laradock_workspace_1 bash
laradock@b44c4ca7a3d7:/var/www$

這樣一來,你就是以 laradock 這個用戶的身份,在 laradock_workspace_1 這個 container 裡面進行操作了。

所以,當你的設定是 DB_HOST=mysql,你就可以進行 migration 了!

有點像是登入對方的主機直接進行操作的意思嗎?我來試試,謝謝!

我要留言

立即登入留言