Как я могу использовать свои собственные имена столбцов при работе с Eloquent ORM в Laravel 4?

Предположим, у меня есть следующая таблица MySQL:

CREATE TABLE backend_users(
id INT NOT NULL AUTO_INCREMENT,
userName VARCHAR(30) UNIQUE NOT NULL,
password VARCHAR(40) NOT NULL,
salt VARCHAR(16) NOT NULL,
needsNewPassword TINYINT(1) UNSIGNED NOT NULL,
forgotPasswordKey VARCHAR(8) NULL,
fullName VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL,
roleType INT NOT NULL,
enabled TINYINT(1) UNSIGNED NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
) CHARACTER SET utf8 COLLATE utf8_general_ci;

Как я могу использовать модель Eloquent для записи новых строк в таблицу, используя имена столбцов, указанные выше? Если я попробую это, как описано в документах:

$user = User::create(
array(
'userName' => 'emmanuel',
'password' => $encryptedPassword,
'salt' => $salt,
'needsNewPassword' => 0,
'fullName' => 'Emmanuel Figuerola',
'email' => '[email protected]',
'roleType' => 0,
'enabled' => 1
)
);

Я получаю следующую ошибку:

Исключение: SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец «user_name» в «списке полей» (SQL: вставить в значения backend_users (user_name, password, salt, needs_new_password, full_name, email, role_type, enabled, updated_at, created_at) (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) (Привязки: массив ( 0 => 'emmanuel', 1 => '70b104a42c4ac5e79ca7c150bf872b383e0eedca', 2 => '5514512bffb33f4a', 3 = > 0, 4 => 'Эммануэль Фигуэрола', 5 => '[email protected]', 6 => 0, 7 => 1, 8 => DateTime::__set_state(array( 'date' => '2013- 02-26 00:20:03', 'timezone_type' => 3, 'timezone' => 'UTC', )), 9 => DateTime::__set_state(array( 'date' => '2013-02-26 00:20:03', 'timezone_type' => 3, 'timezone' => 'UTC', )))

Что, если вы не хотите читать все это, просто означает, что Eloquent использует любые имена столбцов, которые он хочет, а не имена МОИХ столбцов, даже когда я четко указал имя и значение для каждого из них.

Что я должен делать? Если возможно, не говорите «переименуйте столбцы», потому что это будет означать переименование МНОЖЕСТВА КОЛОНН (у меня много таблиц). Кроме того, я нигде не читал о конкретном соглашении об именах столбцов.


person Emmanuel Figuerola    schedule 26.02.2013    source источник


Ответы (2)


Laravel предполагает, что имена столбцов используют соглашение об змеях. Это встроено в сам Eloquent. На самом деле Laravel не знает имена ваших столбцов и таблиц заранее.

Можно было бы расширить Eloquent и переопределить любые методы для динамического создания имен таблиц и столбцов. Поскольку Laravel 4 все еще находится в стадии бета-тестирования, вам необходимо обновлять расширенную версию с любыми изменениями в основной ветке разработки. Вероятно, на обновление схемы вашей БД уйдет меньше времени, чем на этот путь.

person kfriend    schedule 27.02.2013
comment
Да, в итоге я переименовал имена столбцов. Это было не так ужасно, потому что это была новая база данных, но если Laravel 4 будет использоваться с существующей БД, которая несколько устарела и содержит значительный объем данных внутри, ожидая, что пользователь Laravel адаптирует свою БД к соответствие соглашениям Eloquent нереально. - person Emmanuel Figuerola; 28.02.2013
comment
Мне было предложено сделать форк, чтобы изменить это конкретное поведение, но тогда вы предполагаете, что разработчики Laravel примут ваши изменения. Если нет, вы должны постоянно обновлять свой форк Laravel 4 в соответствии с прогрессом разработки Laravel, и, по меньшей мере, это проблема. - person Emmanuel Figuerola; 28.02.2013

Вы можете создать BaseModel в каталоге Models и расширить класс Eloquent, а затем поместить

public static $snakeAttributes = false; 

к BaseModel.

С этого момента, если вы расширите BaseModel вместо Eloquent, ваши модели будут работать с вашим собственным соглашением об именах.

person Umut Sirin    schedule 12.07.2013