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

94

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

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

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

protected $table = "admin";

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

Вук Станкович
источник

Ответы:

191

да

class User extends Eloquent {

    protected $primaryKey = 'admin_id';

}
Phirschybar
источник
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

user3186817
источник
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';

}
Ajtrichards
источник
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';

 }
Джей Момая
источник