Как я могу получить доступ к атрибутам с помощью верблюжьего случая?

Чтобы быть последовательным по моему стилю кодирования, я хотел бы использовать 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);
    }
}