Model 的定義在之前 user 的部份已經介紹過,接下來就直接進入步驟:
建立 Model
注意 Model 的命名為第一個字大寫而且為單數,然後與 Migration 的 table 名字有關( Post model 和 posts table )
$ php artisan make:model Post
再來必須將該 Model 的 class include 在整個 project 中
$ composer dump-autoload
為何要做 dump-autoload 的動作??
用 php artisan tinker 來證明一下:
明明確實按照命名規則在建立 model,但依舊出現以下錯誤:
在稍微了解 PSR-4 以及 laravel 框架架構的相關文件後,了解所有的 classname 都會記錄在 vendor/composer/autoload_classmap.php,於是就來找有沒有 App\Post 的線索,結果果然沒有顯示
為了將該 class 寫入 autoload_classmap.php,執行上述的 autoload 動作,再來查看 autoload_classmap.php,結果 App\Post 就有被寫進去
再用 tinker 去測試後變成可以執行
<速解>
不過為了避免太冗長的步驟,我們通常會在建立 Model 的同時會建立 migration,而不是相本系列先建立 migration 後才建立 Model,在此同時該 Model 的 classname 就會被載入 autoload_classmap.php 中
$ php artisan make:model Post -m
Model 設定
首先來定義 mass assignment 的部份
*Post.php
protected $fillable = ['user_id', 'title', 'content'];
再來定義 user 和 post 之間的關聯性 :
*Post.php
public function user(){
return $this->belongsTo(User::class);
}
*User.php
public function posts(){
return $this->hasMany(Post::class);
}
完整程式碼:
*Post.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\User;
class Post extends Model
{
protected $fillable = ['user_id', 'title', 'content'];
public function user(){
return $this->belongsTo(User::class);
}
}
*User.php
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use App\Post;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'is_admin', 'api_token'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token', 'api_token'
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function posts(){
return $this->hasMany(Post::class);
}
}
參考資料: