【问题标题】:How can I use my own column names while working with Laravel 4's Eloquent ORM?在使用 Laravel 4 的 Eloquent ORM 时如何使用我自己的列名?
【发布时间】:2013-02-26 00:51:56
【问题描述】:

假设我有以下 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' => 'somemail@gmail.com',
'roleType' => 0,
'enabled' => 1
)
);

我收到以下错误:

异常:SQLSTATE[42S22]:找不到列:1054 未知列 '字段列表'中的'user_name'(SQL:插入backend_users (user_name, password, salt, needs_new_password, full_name, emailrole_typeenabledupdated_atcreated_at) 值 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) (绑定: array ( 0 => 'emmanuel', 1 => '70b104a42c4ac5e79ca7c150bf872b383e0eedca', 2 => '5514512bffb33f4a', 3 => 0, 4 => '伊曼纽尔·菲格罗拉', 5 => 'somemail@gmail.com', 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 使用的是它想要的任何列名,而不是我的列名,即使我明确指定了每个列的名称和值。

我该怎么办?如果可能,请不要说“重命名列”,因为这意味着重命名很多列(我有很多表)。此外,我没有阅读任何有关列名的特定命名约定的信息。

【问题讨论】:

    标签: mysql laravel laravel-4 eloquent columnname


    【解决方案1】:

    可以在Models目录下创建BaseModel,扩展Eloquent类,然后放

    public static $snakeAttributes = false; 
    

    BaseModel

    从现在开始,如果您扩展 BaseModel 而不是 Eloquent,您的模型将使用您自己的命名约定。

    【讨论】:

      【解决方案2】:

      Laravel 假定列名使用蛇大小写约定。这是 Eloquent 本身内置的。 Laravel 实际上并不提前知道你的列名和表名。

      可以扩展 Eloquent 并覆盖动态创建表和列名的任何方法。由于 Laravel 4 仍处于测试阶段,你需要保持你的扩展版本与任何上游更改保持同步。更新数据库架构的时间可能会更少,然后冒险走这条路。

      【讨论】:

      • 是的,我最终重命名了我的列名。它并没有那么可怕,因为它是一个新数据库,但是如果 Laravel 4 要与一个有点旧并且里面有大量数据的现有数据库一起使用,那么希望 Laravel 用户调整他/她的数据库以适应匹配 Eloquent 的约定是不现实的。
      • 有人建议我可以创建一个 fork 来改变这种特定的行为,但是你假设 Laravel 的开发人员会接受你的更改。如果没有,您必须让 Laravel 4 的分支与 Laravel 的开发进度保持同步,至少可以这么说,这很痛苦。
      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2013-07-07
      • 2014-01-03
      • 2015-03-15
      • 2013-07-07
      • 1970-01-01
      • 2014-03-27
      • 2015-03-22
      相关资源
      最近更新 更多