How can I access attributes using camel case?

Create your own BaseModel class and override the following methods. Make sure all your other models extend your BaseModel.

namespace App;

use Illuminate\Foundation\Auth\User;
use Illuminate\Support\Str;

class BaseUser extends User
{
    public function getAttribute($key) {
        if (array_key_exists($key, $this->relations)) {
            return parent::getAttribute($key);
        } else {
            return parent::getAttribute(Str::snake($key));
        }
    }

    public function setAttribute($key, $value) {
        return parent::setAttribute(Str::snake($key), $value);
    }
}

Then for usage:

// Database column: first_name

echo $user->first_name; // Still works
echo $user->firstName; // Works too!

This trick revolves around forcing the key to snake case by overriding the magic method used in Model.


Since SO doesn't allow pasting code snippets in comments, I'm posting this as a new answer.

To make sure that eager loading does not break, I had to modify @Lazlo's answer. When accessing eagerly loaded relations by a different key, they are reloaded.

<?php

class BaseModel extends Eloquent
{

    public function getAttribute($key)
    {
        if (array_key_exists($key, $this->relations)) {
            return parent::getAttribute($key);
        } else {
            return parent::getAttribute(snake_case($key));
        }
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($key), $value);
    }
}

Just thought I'd post this in case it helps anyone else. Though the entry by Bouke is great it does not address lazy-loaded relations that use a camel-case name. When this occurs we simply need to check for the method name in addition to the other checks. The following is what I did:

class BaseModel extends Eloquent
{

    public function getAttribute($key)
    {

        if (array_key_exists($key, $this->relations)
          || method_exists($this, $key)
        )
        {
            return parent::getAttribute($key);
        }
        else
        {
            return parent::getAttribute(snake_case($key));
        }
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($key), $value);
    }
}