无法从Laravel';s主键为varchar时的Eloquent


Cant retrieve column value from Laravel's Eloquent when primary key is varchar

我遇到了一个问题,我的Laravel的Eloquent模型没有给我名为"id"的列的值,它只是变成了一个整数(0)而不是字符串。我认为该列在某种程度上受到了保护,但在其他"id"是intender的模型中,它返回的值很好。

问题:我不能将VARCHAR用于主键吗?

注意:我必须用各自的模型创建更多的表,其中主键需要是字符串;我是一个新的Laravel

迁移:

Schema::create('country', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->string('id', 5);
        $table->string('name', 45);
        $table->string('currency_symbol', 5);
        $table->string('currency_name', 45);
        $table->float('tax_rate');
        $table->string('url')->nullable();
        $table->string('support_email', 90);
        $table->string('noreply_email', 90);
        $table->boolean('active');
        $table->boolean('root');
        $table->primary('id');
    });

模型非常简单:

use Illuminate'Database'Eloquent'Model;
class Country extends Model
{
    protected $table = 'country';
}

但当我试图取回它时…

echo Country::find('ve')->first()->toJSON(); 
//Output:
{"id":0,"name":"Test","currency_symbol":"T".....
// And...
var_dump(Country::find('ve')->first()->id);
//Output:
int:0

但如果我使用print_r()函数,这就是输出:

    App'Http'Models'Country'Country Object
    (
        [table:protected] => country
        [connection:protected] => 
        [primaryKey:protected] => id
        [perPage:protected] => 15
        [incrementing] => 1
        [timestamps] => 1
        [attributes:protected] => Array
        (
            [id] => ve
            [name] => Test
            [currency_symbol] => T
            [currency_name] => Test currency
            [tax_rate] => 12
            [url] => 
            [support_email] => support@example.com
            [noreply_email] => roreply@example.com
            [active] => 1
            [root] => 1
        )
        [original:protected] => Array
        (
            [id] => ve
            [name] => Test
            [currency_symbol] => T
            [currency_name] => Test currency
            [tax_rate] => 12
            [url] => 
            [support_email] => support@example.com
            [noreply_email] => roreply@example.com
            [active] => 1
            [root] => 1
        )
        [relations:protected] => Array
            (
            )
        [hidden:protected] => Array
            (
            )
        [visible:protected] => Array
            (
            )
        [appends:protected] => Array
           (
           )
        [fillable:protected] => Array
            (
            )
        [guarded:protected] => Array
            (
                [0] => *
            )
        [dates:protected] => Array
                             (
                             )
        [dateFormat:protected] => 
        [casts:protected] => Array
             (
             )
        [touches:protected] => Array
           (
           )
        [observables:protected] => Array
           (
           )
        [with:protected] => Array
            (
            )
        [morphClass:protected] => 
        [exists] => 1
        [wasRecentlyCreated] => 
    )

如有必要:

  • Laravel版本:5.2
  • PHP:5.6.15

如果主键不是一个自动递增的值,那么您需要让模型知道它不是。否则,它会自动尝试将主键转换为整数。

因此,尝试将其添加到模型中,然后检索值。

public $incrementing = false;

需要注意的另一件事是,在使用find()方法时,不需要调用first()。在幕后,它已经为你做到了,所以你可以把它缩短为:

Country::find('ve')->id;