知道怎麼建立資料庫,並修改資料庫格式了。再來就是存取囉!
說到存取資料庫,就勢必會碰觸到 Laravel 另一個核心的物件: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();
});
然後連線看看
咦?怎麼回事?我們不是已經成功的和資料庫連線過了嗎?為什麼網站連線不上?
這是因為我們使用了 docker,對開發機的環境設置來說,連線 127.0.0.1
是合理的,但是對於運作 Laravel 程式的 docker container 來說,這樣連線環境設置是錯誤的,所以會導致連線失敗。
我們必須將 .env
的 DB_HOST
改成
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
然後,我們再連線看看,應該就可以看到 [ ]
了!
如果我們在資料庫裡面加入一些內容
然後,網頁應該要顯示
[
{
id: 1,
content: "Laravel 6.0 tutorial",
created_at: null,
updated_at: null
}
]
我們成功地在網頁存取資料庫內容囉!
最後總結一下今天我們學到的東西
我們學到該怎麼建立 Eloquent Model,並在網頁上存取裡面的內容。
希望各位覺得這篇文章有學到東西!我們明天見!
想問一下如果HOST
改成mysql
之後,就沒辦法migrate資料表,改回去127.0.0.1
又可以,有沒有什麼辦法可以不用這樣改來改去的呢?
有的!就是在 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 了!
有點像是登入對方的主機直接進行操作的意思嗎?我來試試,謝謝!