Как я могу получить доступ к атрибутам с помощью верблюжьего случая?
Чтобы быть последовательным по моему стилю кодирования, я хотел бы использовать camelCase
для доступа к атрибутам вместо snake_case
. Возможно ли это в Laravel без изменения основной структуры? Если да, то как?
Пример:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
Ответы
Ответ 1
Создайте свой собственный класс BaseModel
и переопределите следующие методы. Убедитесь, что все ваши другие модели extend
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);
}
}
Затем для использования:
// Database column: first_name
echo $user->first_name; // Still works
echo $user->firstName; // Works too!
Этот трюк вращается вокруг форсирования ключа для случая змеи, переопределяя магический метод, используемый в Model
.
Ответ 2
Поскольку SO не позволяет вставлять фрагменты кода в комментарии, я отправляю это как новый ответ.
Чтобы убедиться, что загруженная загрузка не прерывается, мне пришлось изменить ответ @Lazlo. При доступе к загруженным отношениям с помощью другого ключа они перезагружаются.
<?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);
}
}
Ответ 3
Просто подумал, что я опубликую это, если это поможет кому-то еще. Хотя запись Bouke великолепна, она не касается ленивых нагрузок, которые используют имя верблюда. Когда это происходит, нам просто нужно проверить имя метода в дополнение к другим проверкам. Вот что я сделал:
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);
}
}