Laravel 5.2 - Use a String as a Custom Primary Key for Eloquent Table becomes 0

前端 未结 5 1776
萌比男神i
萌比男神i 2020-12-01 01:23

I am trying to use email as my table\'s primary key, so my eloquent code is-



        
相关标签:
5条回答
  • 2020-12-01 01:33

    keep using the id


    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class UserVerification extends Model
    {
        protected $table = 'user_verification';
        protected $fillable =   [
                                'id',
                                'email',
                                'verification_token'
                                ];
        //$timestamps = false;
        protected $primaryKey = 'verification_token';
    }
    

    and get the email :

    $usr = User::find($id);
    $token = $usr->verification_token;
    $email = UserVerification::find($token);
    
    0 讨论(0)
  • 2020-12-01 01:42

    This was added to the upgrade documentation on Dec 29, 2015, so if you upgraded before then you probably missed it.

    When fetching any attribute from the model it checks if that column should be cast as an integer, string, etc.

    By default, for auto-incrementing tables, the ID is assumed to be an integer in this method:

    https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2790

    So the solution is:

    class UserVerification extends Model
    {
        protected $primaryKey = 'your_key_name'; // or null
    
        public $incrementing = false;
    
        // In Laravel 6.0+ make sure to also set $keyType
        protected $keyType = 'string';
    }
    
    0 讨论(0)
  • 2020-12-01 01:42

    On the model set $incrementing to false

    public $incrementing = false;
    

    This will stop it from thinking it is an auto increment field.

    Laravel Docs - Eloquent - Defining Models

    0 讨论(0)
  • 2020-12-01 01:47

    Theres two properties on the model you need to set. The first $primaryKey to tell the model what column to expect the primary key on. The second $incrementing so it knows the primary key isn't a linear auto incrementing value.

    class MyModel extends Model
    {
        protected $primaryKey = 'my_column';
    
        public $incrementing = false;
    }
    

    For more info see the Primary Keys section in the documentation on Eloquent.

    0 讨论(0)
  • 2020-12-01 01:53

    I was using Postman to test my Laravel API.

    I received an error that stated

    "SQLSTATE[42S22]: Column not found: 1054 Unknown column" because Laravel was trying to automatically create two columns "created_at" and "updated_at".

    I had to enter public $timestamps = false; to my model. Then, I tested again with Postman and saw that an "id" = 0 variable was being created in my database.

    I finally had to add public $incrementing false; to fix my API.

    0 讨论(0)
提交回复
热议问题