Изменить первичный ключ по умолчанию в Eloquent


94

Могу ли я изменить первичный ключ модели Eloquent.

Я хочу установить первичный ключ, например, admin_idвместо id?

Я знаю, что могу изменить имя таблицы для модели, например

protected $table = "admin";

Есть ли что-то подобное для первичного ключа?

Ответы:


191

да

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

16
Для всех, кто ссылается на этот вопрос, используйте один из других ответов. $primarykeyдолжно быть $primaryKey(заглавная буква K), иначе работать не будет.
Джереми Харрис,

4
Что делать, если в качестве первичного ключа используется несколько полей?
Bagusflyer

@bagusflyer Ты ведь шутишь? Более одного первичного ключа в одной таблице базы данных?
Novica89 01

@bagusflyer Eloquent не поддерживает составные ключи, но вот хороший обходной путь, поэтому вы можете использовать $primaryKey = array('key1', 'key1'); github.com/laravel/framework/issues/5517#issuecomment-52996610
mopo922

К вашему сведению, похоже, что в Laravel 5.4 вам больше не нужно устанавливать собственный ПК, если он совпадает с названием модели, которое он добавляет для вас (и в противном случае выйдет ошибка).
Монетный двор

14
class User extends Eloquent {

    protected $primarykey = 'admin_id';

}

но

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

обратите внимание на букву K (заглавную) в переменной $ primaryKey


11

Если вы хотите использовать составной ключ (строку)

Вам нужно убедиться, что вы установили, public $incrementing = falseиначе laravel будет преобразовывать поле в целое число, давая0

class User extends Model {

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

}

Я переопределил primaryKey как текстовую строку col - значение в коллекции было правильным, но когда я указал на col как $ results-> primary_key, он вернул бы только ноль, хотя коллекция / массив показывала правильную строку - потребовалось некоторое время, чтобы отследите его, когда я заметил, что primaryKey отображается как INT и Incrementable в объекте. Пришлось установить public $ incrementing = false.
G-Man

7

Переменная первичного ключа чувствительна к регистру и должна $primaryKeyработать.

Пример:

protected $primaryKey = 'your_primary_key_id';

Пример в классе модели:

class User extends Eloquent {

    protected $primaryKey = 'your_primary_key_id';

}

1
Мне все еще нужно добавить его в массив $ fillable?
Anis

1
class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}

Согласно документации Laravel:


Eloquent также предполагает, что в каждой таблице есть столбец с первичным ключом id. Вы можете определить $primaryKeyсвойство, чтобы переопределить это соглашение.

Кроме того, Eloquent предполагает, что первичный ключ - это увеличивающееся целочисленное значение, что означает, что по умолчанию первичный ключ будет автоматически преобразован в int. Если вы хотите использовать неинкрементный или нечисловой первичный ключ, вы должны установить для общедоступного $incrementingсвойства вашей модели значение false.


-3

Для назначения первичного ключа вам необходимо ..->

class User extends Eloquent {

    protected $primaryKey='admin_id';

 }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.