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

Чтобы быть последовательным в моем стиле кодирования, я хотел бы использовать camelCase получить доступ к атрибутам вместо snake_case, Возможно ли это в Laravel без изменения базовой структуры? Если так, то как?

Пример:

// Database column: first_name

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

3 ответа

Решение

Создайте свой собственный BaseModel class and override the following methods. Make sure all your other models 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);
    }

}

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,

Так как 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);
    }
}

Просто подумал, что выложу это на случай, если это кому-нибудь поможет. Хотя запись Bouke Versteegh великолепна, она не затрагивает ленивые отношения, которые используют случай с верблюдами. Когда это происходит, нам просто нужно проверить имя метода в дополнение к другим проверкам. Вот что я сделал:

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);
    }
}
Другие вопросы по тегам