Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] Jak zapisać w bazie relacje many to many
Forum PHP.pl > Forum > PHP
rossol
Witam.

Piszę aplikację we frameworku Kohana 2.3.4 używając ORM i AJAX.

Mam problem z zapisaniem danych dotyczących poszczególnych tabel w tabeli łączącej.

W bazie mam 3 tabele:
  1. 1. subjects (id, name)
  2. 2. students (id, name)
  3. 3. subjects_students (id, student_id, subject_id)


Dodając nowego studenta przypisuję mu kilka przedmiotów. Później AJAXem wysyłam zapytanie, jeśli jest ok to zapisuje studenta (co ozacza, że mam jego ID).


Metoda zwracająca dane:
  1. public function add_student_ajax()
  2. {
  3. $this->auto_render = false;
  4.  
  5. $student = ORM::factory('student');
  6.  
  7. $post = $_POST;
  8. $obj = new stdClass();
  9.  
  10. // Walidacja dotyczy tylko imienia, nazwiska itd, a nie przedmiotów
  11. if($student->validate($post)){
  12. if(isset($post['subject'])){
  13. foreach($post['subject'] as $k=>$v){
  14. $student->save();
  15. $student->students_subjects->student_id = $student->id;
  16. }
  17. $obj->status = 'ok';
  18. }else{
  19. $obj->status = 'error';
  20. $obj->message = array('Przedmioty są wymagane!');
  21. }
  22. }else{
  23. $obj->status = 'error';
  24. $obj->message = $post->errors('student');
  25. }
  26.  
  27. echo json_encode($obj);
  28. }


I zapytanie AJAXowe:
  1. $('.form_submit').click(function(e){
  2. e.preventDefault();
  3.  
  4. $.ajax({
  5. url: '<?php echo url::site('items/add_student_ajax') ?>',
  6. type: 'post',
  7. data: $('#myform').serialize(),
  8. dataType: 'json',
  9. success: function(res){
  10. if(res.status == 'ok'){
  11. $.colorbox({
  12. html: 'Zapisano',
  13. onClosed: function(){
  14. location.href = '<?php echo url::site('items/students') ?>'
  15. }
  16. });
  17. }else{
  18. var html = '<ul>';
  19. $.each(res.message, function(k, v){
  20. html += '<li>'+v+'</li>';
  21. });
  22. html += '</ul>';
  23. $.colorbox({
  24. html: html
  25. });
  26. }
  27. }
  28. })
  29. })


Przy zapisywaniu studenta dostaję komunikat:
  1. Właściwość students_subjects w klasie Student_Model nie istnieje.


W modelach:
  1. Model Student:
  2. protected $has_and_belongs_to_many = array('subjects');
  3.  
  4. Model Subject:
  5. protected $has_and_belongs_to_many = array('students');


W tabeli Student zapisują się studenci, a w tabeli Subjects zapisują się przedmioty. Nie mam pojęcia natomiast jak w tabeli pośredniej zapisać te dane.
thek
A zerknąłeś chociaż do dokumentacji ORM Kohany? http://docs.kohanaphp.com/libraries/orm/st...belongs_to_many Bo mam wrażenie, że o czymś zapomniałeś wink.gif Popatrz pod podany link, a zobaczysz, że masz malutki brak zapewne.

EDIT: Jeśli nie łapiesz, to może popatrz na wzorzec nazwy kluczy w tabeli łączącej smile.gif
rossol
Sorki, ale niestety nie łapie.

Oczywiście, że zerknąłem do dokumentacji i wg niej Tworzyłem tabele i połączenia.

Relacje w modelach są ustawione dobrze.
Tabela łącząca ma przecież 'student_id' i 'subject_id'. Nazwy są w liczbie pojedyńczej, tak jak w dokumentacji. Na początku myślałem, że po ustawieniu relacji to framework sam zapisze, ale zaglądając do tabeli po zapisaniu danych nic się nie dzieje. Więc nie wiem czy mam ustawiać dopisywanie ID'ków czy w jaki sposób to rozwiązać.
thek
Ale w Twoim poście nazwy tabel masz w liczbie mnogiej smile.gif A wzorzec nazwy to NAZWATABELI_id, tak więc klucze powinny brzmieć subjects_id i students_id.
rossol
Niestety jesteś w błędzie. Zgodnie z dokumentacją to właśnie tabele mają liczbę pojedyńczą. Tak czy inaczej - dzięki za chęć pomocy smile.gif

Znalazłem rozwiązanie problemu:
  1. foreach($post['subject'] as $k=>$v){
  2. $student->add(ORM::factory('subject', $k));
  3. $student->save();
  4. }


Może komuś się przyda.
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.