iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
1

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,但依舊出現以下錯誤:

    image alt

    在稍微了解 PSR-4 以及 laravel 框架架構的相關文件後,了解所有的 classname 都會記錄在 vendor/composer/autoload_classmap.php,於是就來找有沒有 App\Post 的線索,結果果然沒有顯示

    image alt

    為了將該 class 寫入 autoload_classmap.php,執行上述的 autoload 動作,再來查看 autoload_classmap.php,結果 App\Post 就有被寫進去

    image alt

    再用 tinker 去測試後變成可以執行

    image alt

    <速解>
    不過為了避免太冗長的步驟,我們通常會在建立 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);
        }
    }
    

參考資料:

  1. Eloquent : https://laravel.com/docs/6.x/eloquent
  2. Eloquent relationship : https://laravel.com/docs/6.x/eloquent-relationships
  3. Laravel: class ... does not exists : https://stackoverflow.com/questions/51459802/laravel-class-app-posts-does-not-exists/51463339#51463339
  4. PSR-4: Autoloader : https://www.php-fig.org/psr/psr-4/
  5. What does ‘composer dump-autoload’ do in Laravel? : https://developed.be/2014/08/29/composer-dump-autoload-laravel/

上一篇
Day 18 : 貼文 ( Migration )
下一篇
Day 20 : 貼文 ( api routes & middleware )
系列文
從零開始的Laravel RESTful api30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言