Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I encountered an issue where my Laravel's Eloquent Model does not give me the value of the column called 'id' it just turn to be an integer (0) instead of a string. I though the column was somehow protected but in other Models where the 'id' is an intenger it return the value just fine.

Question: Can't I use VARCHAR for primary keys?

Note: I have to create more tables with respective models where the primary key need to be a string; I'm kinda new Laravel

Migration:

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');
    });

Model is really simple:

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
    protected $table = 'country';
}

But when i try to retrieve it...

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

But if I use print_r() function this is the output:

    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] => [email protected]
            [noreply_email] => [email protected]
            [active] => 1
            [root] => 1
        )

        [original:protected] => Array
        (
            [id] => ve
            [name] => Test
            [currency_symbol] => T
            [currency_name] => Test currency
            [tax_rate] => 12
            [url] => 
            [support_email] => [email protected]
            [noreply_email] => [email protected]
            [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] => 
    )

if necessary:

  • Laravel version: 5.2
  • PHP: 5.6.15
like image 455
David Lavieri Avatar asked Apr 08 '16 22:04

David Lavieri


1 Answers

If your primary key is not an auto-incrementing value, then you need to let the model know that it's not. Otherwise, it automatically tries to convert the primary key into an integer.

So, try adding this to your model, and then retrieving the value.

public $incrementing = false;

Another thing to note is that you don't need to call first() when you use the find() method. Behind the scenes, it already does that for you so you can shorten it to this:

Country::find('ve')->id;
like image 174
Thomas Kim Avatar answered Oct 09 '22 13:10

Thomas Kim