2014-04-22 11 views
25

Mam użytkowników, a użytkownicy należą do dilerów.Zapisywanie powiązanych rekordów w laravel

Po rejestracji użytkownika próbuję zapisać nowego użytkownika i nowego dealera.

Baza danych użytkowników ma kolumnę dealership_id, którą chcę uzupełnić identyfikatorem nowo utworzonego salonu dealerskiego.

To jest mój obecny kod w metodzie sklepu UserController.

public function store() 
{ 
    $user = new User(); 
    $user->email = Input::get('email'); 
    $user->password = Input::get('password'); 


    $dealership = new Dealership(); 
    $dealership->name = Input::get('dealership_name'); 

    $user->push(); 
    return "User Saved"; 

} 

Próba użycia $user->push(); danych użytkownik otrzymuje aktualizowane, ale dealer nie jest tworzony lub aktualizowany.

+0

która część Pobierz kod jest dealerskiej ID:

$dealership->users()->save($user); 

Aby skojarzyć dealerskiej z użytkownikiem, możesz to zrobić? – ajtrichards

+0

Przykro mi, ale byłoby pomocne, gdybym dołączył kod z moich modeli, tak jak przypuszczam, haha. http://laravel.io/bin/N7Pm – BeardedInBindary

Odpowiedz

35

Eloquent's push() ratuje model i jego relacje, ale najpierw musisz powiedzieć, w co chcesz być zaangażowany w relacje.

Ponieważ użytkownik model/tabela posiada identyfikator dealerskiej, zakładam, że użytkownik może należeć tylko do jednej dealerskiej, więc związek powinien wyglądać następująco:

model użytkownika:

public function dealership() 
{ 
    return $this->belongsTo('Dealership'); 
} 

ASO model:

public function users() 
{ 
    return $this->hasMany('User'); 
} 

Aby zapisać Użytkownikowi th e ASO perspektywa, to zrobić:

$user->dealership()->associate($dealership); 
$user->save(); 
+0

Dzięki! Czuję, że to zbliżyło mnie do siebie ... Próbowałem użyć tego przykładu, aby powiązać dealerskie z użytkownikiem i uzyskać ten błąd "Iluminuj \ Baza danych \ QueryException SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1048 Kolumna" dealership_id "nie może be null (SQL: wstaw do wartości 'users' (' email', 'password',' dealership_id', 'updated_at',' created_at') wartości ([email protected], y $ mItUgj2h4JiMi666a3DHROHahjZuRDcgqCaMVDaO..TpurSMVJnWG,, 2014-04 -22 19:59:56, 2014-04-22 19:59:56)) " – BeardedInBindary

+0

Wiem, że to oznacza, że ​​muszę wprowadzić dealership_id do tabeli użytkowników, nie wiem jak to zrobić. Nie mam skonfigurowanej referencji klucza obcego podczas migracji do tabeli użytkowników, czy dodanie reguły klucza obcego może spowodować automatyczne jej naprawienie? Dzięki jeszcze raz! – BeardedInBindary

+2

@SteveBalistreri Domyślam się, że będziesz musiał najpierw "zapisać()" nowy punkt dealerski przed powiązaniem go :) 'new Dealership()' tworzy obiekt, ale nie zapisuje go jeszcze, więc nie ma identyfikatora. Musisz ręcznie wywołać metodę składowania. Alternatywnie możesz to zrobić za pomocą 'create()': 'Dealership :: create (array ('name' => Input :: get ('dealership_name')));' to automatycznie zapisuje nowo utworzony obiekt tak, że ma identyfikator kojarzyć z. – Quasdunk

6

Proszę sprawdzić this answer zobaczyć różnicę push() i save()

Trzeba będzie zdefiniować poprawnie modeli relationships as per documentation Jeśli jest to zrobione poprawnie, to powinno działać. To właśnie push() robi:

/** 
* Save the model and all of its relationships. 
* 
* @return bool 
*/ 

    public function push() 
    { 
     if (! $this->save()) return false; 

     // To sync all of the relationships to the database, we will simply spin through 
     // the relationships and save each model via this "push" method, which allows 
     // us to recurse into all of these nested relations for the model instance. 

     foreach ($this->relations as $models) 
     { 
      foreach (Collection::make($models) as $model) 
      { 
       if (! $model->push()) return false; 
      } 
     } 

     return true; 
    } 

W twoim przypadku, masz jeden (dealerską) należy do wielu (użytkowników)

w modelu użytkownicy:

class Users extends Eloquent { 

    public function dealership() 
    { 
     return $this->belongsTo('Dealership'); 

    } 

} 

W w powyższym przykładzie, Eloquent będzie szukać kolumny dealership_id w tabeli użytkowników. W dealera Model:

class Dealership extends Eloquent { 

    public function users() 
    { 
     return $this->hasMany('User'); 
    } 

} 

W funkcji Store:

public function store() 
    { 
     $user = new User(); 
     $user->email = Input::get('email'); 
     $user->password = Input::get('password'); 


     $user->dealership = new Dealership(); 
     $user->dealership->name = Input::get('dealership_name'); 

     $user->push(); 
     return "User Saved"; 

    } 

Dowiedz się tutaj bardziej o eloquent relationships

Proszę również wziąć look at my answer here

+0

Dzięki, myślę, że mam poprawnie wymyślone stosunki. Wkleiłem tutaj [link] (http://laravel.io/bin/N7Pm). Tabela użytkowników ma kolumnę "dealership_id". Nadal nie wygląda na to, że tworzysz dealerskie i kojarzysz identyfikator dealerskiej z użytkownikiem. – BeardedInBindary

+0

Zaktualizowany, proszę spojrzeć na moją odpowiedź tutaj: http://stackoverflow.com/questions/23183394/creating-new-record-and-relationships-in-one-go/23185225#23185225. Co myślę, i na przykładach, okazuje się, że najpierw trzeba zapisać model podstawowy (tj.) Użytkownika, a użycie push() do aktualizacji –

+1

Tak, push() nie działa z nowymi rekordami. Zobacz ten problem: https://github.com/laravel/framework/issues/4641 Biorąc pod uwagę, że funkcja push() nie jest udokumentowana, bezpieczniej jest użyć funkcji save(). – JustAMartin

1

Za pomocą przycisku na modelu użytkownika , Laravel w zasadzie rekursywnie wywołuje zapis na wszystkich powiązanych modelach (które w tym przypadku nie występują, ponieważ hav jeszcze nie skojarzyły z nim żadnych innych modeli).

Dlatego, aby osiągnąć to, co starasz się zrobić, można to zrobić najpierw utworzyć użytkownik następnie skojarzyć dealerskiej z nim w następujący sposób:

$user = new User(); 
$user->email = Input::get('email'); 
$user->password = Input::get('password'); 
$user->save(); 

$dealership = new Dealership(); 
$dealership->name = Input::get('dealership_name'); 

$user->dealerships()->save($dealership); 
return "User Saved"; 

Jednakże przed ten sposób, należy upewnić się swoimi modelami użytkownika i dealerskie mają ich relacje poprawnie skonfigurowane:

modelu użytkownika:

public function dealership() 
{ 
    return $this->belongsTo('Dealership'); 
} 

ASO model:

public function users() 
{ 
    return $this->hasMany('User'); 
} 
+0

co jeśli zapisujesz powiązane dane/wstawisz nowy rekord związany z push() zamiast save(), czy to możliwe? –

+0

Funkcja push() nie działa z nowymi rekordami. Zobacz ten problem: https://github.com/laravel/framework/issues/4641 Biorąc pod uwagę, że funkcja push() nie jest udokumentowana, bezpieczniej jest użyć funkcji save(). – JustAMartin

Powiązane problemy