Home » Php » How can I access attributes using camel case?

How can I access attributes using camel case?

Posted by: admin October 29, 2017 Leave a comment

Questions:

To be consistent over my coding style, I’d like to use camelCase to access attributes instead of snake_case. Is this possible in Laravel without modifying the core framework? If so, how?

Example:

// Database column: first_name

echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
Answers:

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

class BaseModel extends Eloquent {

    // Allow for camelCased attribute access

    public function getAttribute($key)
    {
        return parent::getAttribute(snake_case($key));
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($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.

Questions:
Answers:

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);
    }
}