Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Laravel] Relacja OneToOne w jednym formularzu.
Forum PHP.pl > Forum > PHP > Frameworki
q3trm
Witam.

Przejdę od razu do sedna. Mam dwie tabelę user i person które są połączone relacja 1:1 - służą do zapisu danych z formularza rejestracyjnego. Problem polaga na tym, że nie mogę zapisać id_user w tabeli person dry.gif nie wiem o co chodzi, wszystkie obiekty wypełnione danymi metodyka jak z dokumentacji, a otrzymuję błąd "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_user' cannot be null ".

tak wygląda migracja
  1.  
  2. Schema::create('user', function($table) {
  3. $table->increments('id');
  4.  
  5. $table->string('username');
  6. $table->string('email');
  7. $table->string('password');
  8. $table->string('confirmation_code');
  9. $table->boolean('confirmed')->default(false);
  10. $table->timestamps();
  11.  
  12. $table->engine = 'InnoDB';
  13. });
  14. Schema::create('person', function($t) {
  15.  
  16. $t->increments('id');
  17. $t->string('name', '20');
  18. $t->string('surname', ' 35');
  19. $t->string('addres', '400');
  20. $t->string('email', '40');
  21. $t->string('phone', '15');
  22. $t->timestamps();
  23.  
  24. $t->integer('id_user')->unsigned();
  25. $t->foreign('id_user')->references('id')->on('user');
  26. $t->engine = 'InnoDB';
  27. });
  28.  


Model User i Person
  1. class User extends ConfideUser {
  2.  
  3. protected $table= 'user';
  4.  
  5. public function person() {
  6. return $this->hasOne('Person', 'id_user');
  7. }
  8.  
  9. }
  10. class Person extends Eloquent{
  11.  
  12. protected $table= 'person';
  13.  
  14.  
  15. public function user() {
  16. return $this->belongsTo('User','id_user');
  17. }
  18. }
  19.  
  20.  


Kontroler
  1.  
  2. protected function postRegistration() {
  3.  
  4. $user = new User();
  5. $person = new Person();
  6.  
  7. $user->username = Input::get('username');
  8. $user->password = Input::get('password');
  9. $user->email = Input::get('email');
  10.  
  11. $person->name = Input::get('name');
  12. $person->surname = Input::get('surname');
  13. $person->addres = Input::get('addres');
  14.  
  15. $user->person()->save($person);
  16.  


Jak w laravel przekazać relacyjne id tabeli user do tabeli person?
matiit
Przed ostatnią linijką daj $person->save()
q3trm
Niestety rezultat taki sam dry.gif . W doctrine wszystko dzieję się za kurtyną, a tu, po prostu nie wiem, czy ja robię błąd, czy może coś w laravel jest nie tak. Nie mogę znaleźć przykładu, w którym dane z formularza są zapisywane w jednym żądaniu do dwóch tabele połączonych relacją sciana.gif.

Piotr33
Proponuję najpierw zapisać użytkownika, a następnie tworzyć obiekt osoby i zapisywać go do bazy. Z komunikatu wynika, że pole id_user ( user_id, jak już!) jest puste w momencie zapisu.
q3trm
Aktualnie kod prezentuje się tak:

  1. protected function postRegistration() {
  2.  
  3. $user = new User();
  4. $person = new Person();
  5.  
  6. $user->username = Input::get('username');
  7. $user->password = Input::get('password');
  8. $user->email = Input::get('email');
  9. $user->save();
  10.  
  11. $person->name = Input::get('name');
  12. $person->surname = Input::get('surname');
  13. $person->addres = Input::get('addres');
  14.  
  15. $user->person()->save($person);
  16.  
  17. }


Cytat(Piotr33 @ 27.10.2013, 20:30:40 ) *
Proponuję najpierw zapisać użytkownika, a następnie tworzyć obiekt osoby i zapisywać go do bazy.


Wedle powyższego kodu obiekt user jest zapisany w pierwszej kolejności. ORM powinien po użyciu funkcji save() wygenerować id, a w lini 15. $user->person()->save($person) id obiektu User przekazać do klucza obcego w obiekcie Person. Próbowałem nawet pobrać użytkownika z bazy po wykonaniu funkcji save(), ale wychodzi na to samo, obiekt pełny, a id nie przekazane.


phpion
Spróbuj może po partyzancku bez zabawy w relacje między obiektami:
  1. $person->user_id = $user->id;

i potem samo $person->save();

// Edit.
Sposób przedstawiony przez Ciebie działa, nie ma tutaj błędu samego Laravela.
q3trm
id zawsze is NULL po i przed zapisem, jedynie w widoku mogę je zobaczyć. Ciekawi mnie też fakt, że żeby uzyskać dostęp w kontrolerze do atrybutów klasy trzeba pierwsze pobrać atrybuty do tablicy za pomocą funkcji attributesToArray(), funkcja zwraca wszystkie atrybuty poza id, które jak się domyślam jest atrybutem publicznym, a domyślam się ponieważ jeszcze nie zaglądałem do klasy Eloquent.

Szukam jakiś przykładów, które pomogły, by mi w rozwiązaniu mojego problemu jednoczesnego zapisu danych z formularza do tabel połączonych relacją OneToOne.
phpion
Sprawdź czy aby na pewno user.id jest polem AUTO_INCREMENT. Może tu leży problem? Tak jak pisałem: analogiczny kod do Twojego działa bez zarzutu.
q3trm
Cytat(phpion @ 29.10.2013, 08:15:17 ) *
Sprawdź czy aby na pewno user.id jest polem AUTO_INCREMENT. Może tu leży problem? Tak jak pisałem: analogiczny kod do Twojego działa bez zarzutu.


Jest AUTO_INCREMENT. Dzięki za odpowiedź - jutro zbadam dogłębnie sprawę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.