2014-08-28 10 views
13

Um über meinen Codierungsstil konsistent zu sein, möchte ich camelCase verwenden, um auf Attribute statt snake_case zuzugreifen. Ist das in Laravel möglich, ohne das Kerngerüst zu verändern? Wenn das so ist, wie?Wie kann ich mit camel case auf Attribute zugreifen?

Beispiel:

// Database column: first_name 

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

Antwort

15

Erstellen Sie Ihre eigenen BaseModel Klasse und überschreiben Sie die folgenden Methoden. Stellen Sie sicher, dass alle anderen Modelle extend Ihre BaseModel sind.

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); 
    } 

} 

Dann für Nutzung:

// Database column: first_name 

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

Dieser Trick dreht sich um durch Überschreiben der magische Methode in Model verwendet, um den Schlüssel zu Schlange Fall zwingt.

+2

im sicher, dass Sie http://laravelsnippets.com/ gesehen haben –

+4

Sie müssen auch __isset() und __unset() Methoden erweitern. Sonst funktionieren die Funktionen isset(), empty() und unset() nicht korrekt mit camel case keys. Ich habe einen halben Tag mit diesem Käfer verbracht. – jaaksarv

+0

auf der Suche nach diesem wie die Hölle Bro danke! : D –

10

Da SO das Einfügen von Code-Snippets in Kommentare nicht erlaubt, poste ich dies als neue Antwort.

Um sicherzustellen, dass das eifrige Laden nicht bricht, musste ich @ Lazlos Antwort ändern. Beim Zugriff auf stark geladene Relationen durch einen anderen Schlüssel werden sie neu geladen.

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

Können Sie das Problem erklären, das Sie hier gelöst haben? Ich folge nicht wirklich dieser Verifizierung, die Sie auf dem Relations-Array machen? –

+2

Nehmen wir an, Sie führen die Abfrage '' User :: with ('likedPosts') '' aus, sie wird als '' $ user-> attributes ['likedPosts'] '' gespeichert. Wenn Sie jedoch '' getAttribute'' überschreiben und alles in snake_case ändern, würde es versuchen, auf '' $ user-> attributes ['liked_posts'] '' '' zuzugreifen, wenn Sie '' user-> likedPosts' 'schreiben existiert nicht. Dann lädt Laravel die Beziehung, obwohl die Beziehung bereits geladen war (wie likedPosts). Um dies zu verhindern, ist die "if" -Anweisung erforderlich. –

+0

oh, ich verstehe es jetzt ... Vielen Dank für Ihre Hilfe! ;) –

Verwandte Themen