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?

Vuk Stanković
fonte

Respostas:

190

sim

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}
phirschybar
fonte
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

user3186817
fonte
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;

}
Toby Mellor
fonte
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';

}
ajtrichards
fonte
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.

Gammer
fonte
-3

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

class User extends Eloquent {

    protected $primaryKey='admin_id';

 }
Jay Momaya
fonte