Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF3] Problem z zapisem obiektu do bazy danych
Forum PHP.pl > Forum > PHP > Frameworki
swiezak
Witajcie.
Siedze wlasnie nad fragmentem kodu odpowiedzialnym za import danych z pliku CSV i... zacialem sie na z pozoru blahej rzeczy - nie moge dokonac utrwalenia obiektu $kit (zestaw produktow) w bazie danych z wykorzystaniem frameworka SF3 i Doctrine.

Na poczatek fragmenty encji:
Kit (zestaw produktow)
  1. /**
  2.   * @Assert\NotBlank(
  3.   * message = "Ta wartość nie powinna być pusta. W pierwszej kolejności dodaj rodzaj zestawu produktów."
  4.   * )
  5.   * @ORM\ManyToOne(targetEntity="KitKind", inversedBy="kits", cascade={"persist"})
  6.   * @ORM\JoinColumn(name="kitkind_id", referencedColumnName="id", nullable=false)
  7.   */
  8. protected $kitKind;
  9.  
  10. /**
  11.   * @Assert\NotBlank(
  12.   * message = "Ta wartość nie powinna być pusta. W pierwszej kolejności dodaj typ zestawu produktów."
  13.   * )
  14.   * @ORM\ManyToOne(targetEntity="KitType", inversedBy="kits", cascade={"persist"})
  15.   * @ORM\JoinColumn(name="kittype_id", referencedColumnName="id", nullable=false)
  16.   */
  17. protected $kitType;
  18.  
  19. /**
  20.   * Set kitKind
  21.   *
  22.   * @param \Diet\BackendBundle\Entity\KitKind $kitKind
  23.   *
  24.   * @return Kit
  25.   */
  26. public function setKitKind(\Diet\BackendBundle\Entity\KitKind $kitKind)
  27. {
  28. $this->kitKind = $kitKind;
  29.  
  30. return $this;
  31. //$kitKind->addKit($this); // custom setting
  32. }
  33.  
  34. /**
  35.   * Get kitKind
  36.   *
  37.   * @return \Diet\BackendBundle\Entity\KitKind
  38.   */
  39. public function getKitKind()
  40. {
  41. return $this->kitKind;
  42. }
  43.  
  44. /**
  45.   * Set kitType
  46.   *
  47.   * @param \Diet\BackendBundle\Entity\KitType $kitType
  48.   *
  49.   * @return Kit
  50.   */
  51. public function setKitType(\Diet\BackendBundle\Entity\KitType $kitType)
  52. {
  53. $this->kitType = $kitType;
  54.  
  55. return $this;
  56. //$kitType->addKit($this); // custom setting
  57. }
  58.  
  59. /**
  60.   * Get kitType
  61.   *
  62.   * @return \Diet\BackendBundle\Entity\KitType
  63.   */
  64. public function getKitType()
  65. {
  66. return $this->kitType;
  67. }


KitKind (rodzaj zestawu)
  1. /**
  2.   * @var ArrayCollection
  3.   *
  4.   * @ORM\OneToMany(targetEntity="Kit", mappedBy="kitKind", cascade={"persist"}, fetch="EXTRA_LAZY")
  5.   */
  6. protected $kits;
  7.  
  8. /**
  9.   * Add kit
  10.   *
  11.   * @param \Diet\BackendBundle\Entity\Kit $kit
  12.   *
  13.   * @return KitKind
  14.   */
  15. public function addKit(\Diet\BackendBundle\Entity\Kit $kit)
  16. {
  17. $this->kits[] = $kit;
  18.  
  19. return $this;
  20. //$kit->setKitKind($this); // custom setting
  21. }


KitType (typ zestawu)
  1. /**
  2.   * @var ArrayCollection
  3.   *
  4.   * @ORM\OneToMany(targetEntity="Kit", mappedBy="kitType", cascade={"persist"}, fetch="EXTRA_LAZY")
  5.   */
  6. protected $kits;
  7.  
  8. /**
  9.   * Add kit
  10.   *
  11.   * @param \Diet\BackendBundle\Entity\Kit $kit
  12.   *
  13.   * @return KitType
  14.   */
  15. public function addKit(\Diet\BackendBundle\Entity\Kit $kit)
  16. {
  17. $this->kits[] = $kit;
  18.  
  19. return $this;
  20. //$kit->setKitType($this); // custom setting
  21. }


W kontrolerze mam taki oto fragment kodu:
  1. $product = new Product();
  2. $product->setName($product_name);
  3. $product_slug = $this->slugify($product_name);
  4. $product->setSlug($product_slug);
  5.  
  6. // Zestawy produktów
  7. $kit_image = iconv('windows-1250', 'utf-8', $data[1]);
  8. $kit_name = iconv('windows-1250', 'utf-8', $data[2]);
  9. $kit_slug = $this->slugify($kit_name);
  10. $kit_shortdescription = iconv('windows-1250', 'utf-8', $data[3]);
  11. $kit_description = iconv('windows-1250', 'utf-8', $data[4]);
  12. $kit_kind = iconv('windows-1250', 'utf-8', $data[5]);
  13. $kit_type = iconv('windows-1250', 'utf-8', $data[6]);
  14.  
  15. if ($kit_name != NULL && $kit_kind != NULL && $kit_type != NULL) {
  16. $Kit = $manager->getRepository('DietBackendBundle:Kit')->findOneByName($kit_name);
  17. $KitKind = $manager->getRepository('DietBackendBundle:KitKind')->findOneByName($kit_kind);
  18. $KitType = $manager->getRepository('DietBackendBundle:KitType')->findOneByName($kit_type);
  19.  
  20. if (!$Kit && $KitKind && $KitType) {
  21. $kit = new Kit();
  22. $kit->setName($kit_name);
  23. $kit_slug = $this->slugify($kit_name);
  24. $kit->setSlug($kit_slug);
  25. $kit->setShortDescription($kit_shortdescription);
  26. $kit->setDescription($kit_description);
  27.  
  28. $kit->setKitKind($KitKind); // w tym przypadku wyswietlany jest blad o zduplikowanym kluczu (nazwa rodzaju zestawu produktow jest unikalna, rowniez nazwa samego zestawu)
  29. $kit->setKitType($KitType); // podobnie tutaj
  30. (jesli zaremuje dwie powyzsze linie, otrzymuje zwrotke o wartosciach NULL dla kitkind_id oraz kittype_id)
  31.  
  32. // Zdjęcia zestawu produktów
  33. if ($kit_image != NULL) {
  34. $images_chunks = explode("|", $kit_image);
  35.  
  36. for ($i = 0; $i < count($images_chunks); $i++) {
  37. if (file_exists($this->getUploadDirImages().$images_chunks[$i])) {
  38. $image_name = $images_chunks[$i];
  39.  
  40. if (!file_exists($this->getKitImagesDir().$kit_slug)) {
  41. mkdir($this->getKitImagesDir().$kit_slug, 0777, true);
  42. }
  43.  
  44. $newfile = $this->getKitImagesDir().$kit_slug.'/'.$images_chunks[$i];
  45.  
  46. $filetmp = $this->getUploadDirImages().$images_chunks[$i];
  47. $newfiletmp = $this->getKitImagesDir().$kit_slug.'/'.$images_chunks[$i];
  48. if (!copy($filetmp, $newfiletmp)) {
  49. continue;
  50. }
  51. } else {
  52. continue;
  53. }
  54. $kit->setImage($image_name);
  55. }
  56. } // Zdjęcia zestawu produktów
  57.  
  58. $kit->addProduct($product);
  59. $manager->persist($kit);
  60.  
  61. $manager->flush();
  62. $manager->clear();
  63. }


Czy ktos z Was, szanowni Koledzy i Kolezanki, podpowie, gdzie robie blad? Bede wdzieczny za poswiecony czas i pomoc.
Pilsener
A działa samo:
  1. $kit = new Kit();
  2. $manager->persist($kit);
  3. $manager->flush();

questionmark.gif?
Dociera w ogóle parser do tego miejsca?
Co mówi profiler?
Co zwraca kontroler?
Warto sobie lepiej zorganizować kod: podzielić na metody i używać loggera, sprawdzać każdy etap a Ty natworzyłeś ifów a potem My mamy wiedzieć, dlaczego parser tak głęboko nie dociera?
swiezak
Parser dochodzi do fragmentu:
  1. $kit->setKitKind($KitKind); // w tym przypadku wyswietlany jest blad o zduplikowanym kluczu (nazwa rodzaju zestawu produktow jest unikalna, rowniez nazwa samego zestawu), zamiast zapisac id rodzaju zestawu Doctrine probuje utworzyc nowy wpis w tabeli 'kit_kind'
  2. $kit->setKitType($KitType); // podobnie tutaj
  3. // jesli zaremuje dwie powyzsze linie, otrzymuje zwrotke o wartosciach NULL dla kitkind_id oraz kittype_id


Zatem problem wystepuje w miejscu zapisu obiektu Kit polaczonego relacja z KitKind oraz KitType.
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.