Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inny][Laravel] Relacja OneToOne w jednym formularzu.
q3trm
post 25.10.2013, 12:51:35
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 26.02.2013

Ostrzeżenie: (0%)
-----


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?

Ten post edytował q3trm 25.10.2013, 13:59:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
matiit
post 27.10.2013, 09:48:39
Post #2





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

Ostrzeżenie: (0%)
-----


Przed ostatnią linijką daj $person->save()
Go to the top of the page
+Quote Post
q3trm
post 27.10.2013, 10:31:32
Post #3





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 26.02.2013

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
Piotr33
post 27.10.2013, 20:30:40
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 12.09.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
q3trm
post 28.10.2013, 12:50:32
Post #5





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 26.02.2013

Ostrzeżenie: (0%)
-----


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.


Go to the top of the page
+Quote Post
phpion
post 28.10.2013, 12:55:47
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
q3trm
post 28.10.2013, 17:27:35
Post #7





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 26.02.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post 29.10.2013, 08:15:17
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
q3trm
post 30.10.2013, 22:56:16
Post #9





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 26.02.2013

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:19