2014-08-28 19 views
13

Aby zachować spójność w stosunku do mojego stylu kodowania, chciałbym użyć camelCase, aby uzyskać dostęp do atrybutów zamiast snake_case. Czy jest to możliwe w Laravel bez modyfikowania podstawowej struktury? Jeśli tak to jak?Jak uzyskać dostęp do atrybutów przy użyciu wielbłąda?

Przykład:

// Database column: first_name 

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

Odpowiedz

15

Stwórz własną BaseModel klasę i zastąpić następujące metody. Upewnij się, że wszystkie inne modele extend swoje 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); 
    } 

} 

Wtedy do użytku:

// Database column: first_name 

echo $user->first_name; // Still works 
echo $user->firstName; // Works too! 

Ta sztuczka obraca się wokół zmuszając klucz do przypadku węża nadrzędnymi magiczną metodę stosowaną w Model.

+2

im pewien, że widziałem http://laravelsnippets.com/ –

+4

Trzeba również rozszerzyć __isset() i __unset() metody. W przeciwnym razie funkcje isset(), empty() i unset() nie będą działać poprawnie z kluczami wielbłądów. Spędziłem pół dnia na tym błędzie. – jaaksarv

+0

Szukam tego jak piekło bro dzięki! : D –

10

Ponieważ SO nie pozwala na wklejanie fragmentów kodu w komentarzach, zamieszczam to jako nową odpowiedź.

Aby upewnić się, że chętne ładowanie się nie zepsuło, musiałem zmodyfikować odpowiedź @ Lazlo. Podczas uzyskiwania dostępu do obciążonych relacji za pomocą innego klucza, są one ponownie ładowane.

<?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

Czy możesz wyjaśnić problem, który rozwiązałeś? Naprawdę nie podążam za tą weryfikacją, którą robisz w tablicy relacji? –

+2

Załóżmy, że uruchomisz zapytanie '' User :: with ('likedPosts') '', będzie ono przechowywane jako '' $ user-> attributes ['likedPosts'] ''. Jednakże, gdy nadpiśniesz '' getAttribute'' i zmienisz wszystko na snake_case, to spróbujesz uzyskać dostęp do '' $ user-> attributes ['liked_posts'] '' podczas pisania '' $ user-> likedPosts'', które nie istnieje. Wtedy laravel będzie leniwy ładował relację, mimo że relacja była już załadowana (jak lubiany pakiet). Aby temu zapobiec, konieczne jest wyrażenie '' if''. –

+0

oh, teraz to rozumiem ... wielkie dzięki za pomoc! ;) –

Powiązane problemy