如何在Eloquent中找回小写列名?

时间:2016-11-03 05:12:37

标签: php laravel laravel-5 eloquent

我正在使用一个包含所有大写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);
    }

我无法更改数据库。有没有办法让我雄辩地以小写的形式回复列名?

2 个答案:

答案 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,
            ),
        ),
     )
)

defaultPDO::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