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