2013-06-02 13 views
6

Próbuję wymodelować dość prostą relację między tabelą "Użytkownicy" i tabelą "User_profiles". Każdy użytkownik ma profil user_profile, więc jest prosty jeden do jednego. Zgodnie z docs znajdując @http://four.laravel.com/docs/eloquent#one-to-one Dodałem następującą funkcję do mojego modelu użytkownika:Laravel 4 Eloquent ORM uzyskujący relację jeden-do-jednego dzięki właściwościom dynamicznym

public function user_profile() 
{ 
    return $this->hasOne('User_profile'); 
} 

i jest to zależność zdefiniowane w moim modelu User_profile:

public function user() 
{ 
    return $this->belongsTo('User'); 
} 

Próbuję dostęp z taki kontroler:

// Get current user 
    $user = User::find(Auth::user()->id); 
    $profile = $user->user_profile; 

    print_r($user); 
    print_r($profile); 

    echo "User's name is: " . $user->user_profile->first_name . ' ' . $user->user_profile->last_name; 

Niestety drukowanie użytkownika $ drukuje pola modelu użytkownika, ale nie pokazuje żadnego śladu relacji; $ profil jest pusty. Tablica "relacji" również jest pusta, co, jak sądzę, powinno być wypełnione.

Próbuję użyć „właściwości dynamicznych”, jak sugeruje tutaj http://four.laravel.com/docs/eloquent#dynamic-properties

W przeciwnym razie po prostu przejść:

echo "User's name is: " . $user->user_profile()->first()->first_name . ' ' . $user->user_profile()->first()->last_name; 

To działa .. ale ja nie lubię konieczności zrobić .

Wszelkie sugestie?

Odpowiedz

7

OK, więc problem polegał na użyciu podkreśleń w nazwach klas. Laravel podąża za PSR 0 i 1, jak opisano na here.

Co oznacza, że ​​musiałem nazwać moją klasę modelu i nazwę pliku UserProfile (mimo że moja tabela MySql o nazwie pozostała "user_profiles"), a następnie zaktualizować mój model użytkownika, aby mieć funkcję o nazwie userProfile().

Raz aktualizowane nazewnictwa, mogę przejść do relacji automatycznie robiąc coś takiego:

$user = Auth::user(); 
echo $user->userProfile->first_name; 
+1

kocham L4 ale ten aspekt musi złapać dużo ludzi na zewnątrz. Miałem podobny problem, ale w moim przypadku miało to związek z typami produktów i okazało się, że musiałem nazwać metodę relacji 'productType()' zamiast 'producttype()'. Dziękuję za publikację i mam nadzieję, że pomoże to kilku innym. – JamesG

+0

Tak, dodatkowo irytujące jest to, że zmiana nazwy dotyczy obiektów takich jak tabele i powiązane tabele, ale kończy się powrotem do nazwy podkreślenia dla samych pól tabeli, tj. Nazwa_wyjściowa. Ta niekonsekwencja jest lekko irytująca. – John

Powiązane problemy