2014-08-28 6 views
13

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

Пример:

// Database column: first_name 

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

ответ

15

Создайте свой собственный BaseModel класс и переопределить следующие методы. Убедитесь, что все другие модели extendBaseModel.

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

им, что вы видели http://laravelsnippets.com/ –

+4

Вы также должны расширить __isset() и __unset() методы. В противном случае функции isset(), empty() и unset() будут работать неправильно с клавишами верблюда. Я потратил полдня на эту ошибку. – jaaksarv

+0

ищет это, как черт возьми спасибо! : D –

10

Поскольку 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); 
    } 
} 
+0

Можете ли вы объяснить проблему, которую вы здесь решили? Я не выполняю эту проверку в массиве отношений? –

+2

предположим, что вы запускаете запрос '' User :: with ('lovedPosts') ', он будет храниться как' '$ user-> attributes ['lovedPosts']' '. Однако, когда вы переопределяете '' getAttribute'' и меняете все на snake_case, тогда он будет пытаться получить доступ к '' user_> attributes ['loved_posts'] '', когда вы пишете '$ user-> понравилосьPosts'', что не существует. Тогда laravel будет лениться загружать отношения, хотя отношения уже были загружены (как понравилосьПоства). Чтобы этого не произошло, требуется инструкция '' if''. –

+0

О, я понял это сейчас ... большое спасибо за вашу помощь! ;) –