我正在使用一个包含所有大写snakecase列名的数据库,当我用雄辩的方式获取它们时,我会做类似的事情:
foreach($data as $key => $item){
$data[$key] = array_change_key_case($item);
}
这使得键即列名更小,但很快变得低效,因为我需要嵌套数组,如下所示:
foreach($tasks as $key => $task){
foreach($task['users'] as $innerKey => $user){
$task['users'][$innerKey] = array_change_key_case($user);
}
$tasks[$key] = array_change_key_case($task);
}
我无法更改数据库。有没有办法让我雄辩地以小写的形式回复列名?
答案 0 :(得分:4)
您可以在驱动程序级别using PDO attributes转换列名称。为此,请设置Laravel connection options(在app/config/database.php
中),如下所示:
return array(
'connections' => array(
'mysql' => array(
'options' => array(
PDO::ATTR_CASE => PDO::CASE_LOWER,
),
),
)
)
default是PDO::CASE_NATURAL
,这就是您的代码在数据库存储它们时看到它们的原因。
更新:如果您使用的是MySQL,可以考虑设置lower_case_table_names = 2,告诉服务器:
如果设置为2,表名将按给定方式存储,但会以小写形式进行比较。此选项也适用于数据库名称和表别名。
答案 1 :(得分:0)
如果覆盖模型上的getAttribute()
方法,则可以在调用之前转换密钥:
public function getAttribute($key)
{
$databaseColumn = implode('_', array_map('ucfirst', explode('_', $key)));
return parent::getAttribute($databaseColumn);
}
这样您就可以$model->get_model_param
,并且可以访问模型上的$model->Get_Model_Param
。