Alterar a chave primária padrão no Eloquent


92

Posso mudar a chave primária do modelo Eloquent.

Quero definir a chave primária, por exemplo, em admin_idvez de 'id'?

Eu sei que posso mudar o nome da tabela para um modelo como

protected $table = "admin";

Existe algo semelhante para a chave primária?

Respostas:


190

sim

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

16
Para qualquer outra pessoa que fizer referência a esta pergunta, use uma das outras respostas. $primarykeydeve ser $primaryKey(letra K maiúscula) e não funcionará de outra forma.
Jeremy Harris

4
E se eu tiver mais de um campo como chave primária?
Bagusflyer

@bagusflyer Você está brincando, certo? Mais de uma chave primária em uma tabela de banco de dados?
Novica89 de

@bagusflyer Eloquent não oferece suporte a chaves compostas, mas aqui está uma boa solução alternativa para que você possa ter $primaryKey = array('key1', 'key1'); github.com/laravel/framework/issues/5517#issuecomment-52996610
mopo922

Apenas para sua informação, parece que no Laravel 5.4 você não precisa mais definir seu próprio PK se for o mesmo que o nome do modelo conforme ele adiciona para você (e, caso contrário, ocorrerá um erro).
Mint

14
class User extends Eloquent {

    protected $primarykey = 'admin_id';

}

mas

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

observe a letra K (maiúscula) na variável $ primaryKey


9

Se você quiser usar uma chave composta (uma string)

Você precisa ter certeza de definir, public $incrementing = falsecaso contrário, laravel lançará o campo para um inteiro, dando0

class User extends Model {

    protected $primaryKey = 'my_string_key';
    public $incrementing = false;

}

Eu fiz uma substituição na primaryKey como uma string de texto col - o valor na coleção estava correto, mas quando eu referenciei a col como $ results-> primary_key ela retornaria apenas zero, embora a coleção / array mostrasse a string correta - demorou um pouco para rastreá-lo quando percebi que a primaryKey estava sendo exibida como um INT e incrementável no objeto. Tive que definir public $ incrementing = false.
G-Man

7

A variável de chave primária faz distinção entre maiúsculas e minúsculas e deve $primaryKeyfuncionar.

Exemplo:

protected $primaryKey = 'your_primary_key_id';

Exemplo dentro de uma classe Model:

class User extends Eloquent {

    protected $primaryKey = 'your_primary_key_id';

}

1
Eu ainda tenho que adicioná-lo ao array $ fillable?
Anis

1
class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

De acordo com a documentação do Laravel:


O Eloquent também assumirá que cada tabela possui uma coluna de chave primária chamada id. Você pode definir uma $primaryKeypropriedade para substituir esta convenção.

Além disso, o Eloquent assume que a chave primária é um valor inteiro incremental, o que significa que por padrão a chave primária será convertida para um int automaticamente. Se desejar usar uma chave primária não incremental ou não numérica, você deve definir a $incrementingpropriedade pública em seu modelo como falsa.


-3

Para atribuir uma chave primária você deve ..->

class User extends Eloquent {

    protected $primaryKey='admin_id';

 }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.