Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Doctrine2] Problem z zapisem id uzytkownika do tabeli z zamowieniami
Forum PHP.pl > Forum > Gotowe rozwiązania
swiezak
Mam problem z zapisem id zalogowanego uzytkownika do tabeli z zamowieniami.

Ponizej uproszczona struktura bazy danych:
  1. fos_user
  2.  
  3. id
  4. name
  5. surname
  6.  
  7. --
  8.  
  9. orders
  10.  
  11. id
  12. user_id
  13. order_payment_id
  14. order_shipment_id
  15. order_status_id



Ml\UserBundle\Entity\User.php
  1. namespace Ml\UserBundle\Entity;
  2. use Gedmo\Mapping\Annotation as Gedmo;
  3. use Ml\FrontendBundle\Entity\Orders;
  4.  
  5. use FOS\UserBundle\Model\User as BaseUser;
  6. use Doctrine\ORM\Mapping as ORM;
  7.  
  8. /**
  9. * @ORM\Entity
  10. * @ORM\Table(name="fos_user")
  11. * @ORM\Entity(repositoryClass="Ml\UserBundle\Entity\UserRepository")
  12. */
  13. class User extends BaseUser
  14. {
  15. /**
  16. * @ORM\Id
  17. * @ORM\Column(type="integer")
  18. * @ORM\GeneratedValue(strategy="AUTO")
  19. */
  20. protected $id;
  21.  
  22. /**
  23.   * @var string
  24.   *
  25.   * @ORM\Column(name="name", type="string", length=50, nullable=true)
  26.   */
  27. private $name;
  28.  
  29. /**
  30.   * @var string
  31.   *
  32.   * @ORM\Column(name="surname", type="string", length=50, nullable=true)
  33.   */
  34. private $surname;
  35.  
  36. /**
  37.   * @ORM\OneToMany(targetEntity = "Ml\FrontendBundle\Entity\Orders", mappedBy = "user", cascade={"remove", "persist"})
  38.   *
  39.   */
  40. protected $orders;
  41.  
  42. /**
  43.   * Constructor
  44.   */
  45. public function __construct()
  46. {
  47. parent::__construct();
  48. }
  49.  
  50. /**
  51.   * Get orders
  52.   *
  53.   * @return \Doctrine\Common\Collections\Collection
  54.   */
  55. public function getOrders()
  56. {
  57. return $this->orders;
  58. }
  59.  
  60. public function __toString()
  61. {
  62. return (string) $this->getUsername();
  63. }
  64. }


Ml\FrontendBundle\Entity\Orders.php
  1. namespace Ml\FrontendBundle\Entity;
  2.  
  3. use Ml\UserBundle\Entity\User;
  4.  
  5. use Gedmo\Mapping\Annotation as Gedmo;
  6. use Symfony\Component\Validator\Constraints as Assert;
  7.  
  8. use FOS\UserBundle\Model\User as BaseUser;
  9. use Doctrine\ORM\Mapping as ORM;
  10.  
  11. /**
  12.  * Orders
  13.  *
  14.  * @ORM\Table()
  15.  * @ORM\Entity
  16.  */
  17. class Orders
  18. {
  19. /**
  20.   * @var integer
  21.   *
  22.   * @ORM\Column(name="id", type="integer")
  23.   * @ORM\Id
  24.   * @ORM\GeneratedValue(strategy="AUTO")
  25.   */
  26. private $id;
  27.  
  28. /**
  29.   * @Assert\NotBlank
  30.   * @ORM\ManyToOne(targetEntity="Ml\UserBundle\Entity\User", inversedBy="orders")
  31.   * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
  32.   *
  33.   */
  34. private $user;
  35.  
  36. /**
  37.   * @Assert\NotBlank
  38.   * @ORM\ManyToOne(targetEntity="Payments", inversedBy="orders")
  39.   * @ORM\JoinColumn(name="order_payment_id", referencedColumnName="id", nullable=false)
  40.   *
  41.   */
  42. protected $orderPayment;
  43.  
  44. /**
  45.   * @Assert\NotBlank
  46.   * @ORM\ManyToOne(targetEntity="Shipments", inversedBy="orders")
  47.   * @ORM\JoinColumn(name="order_shipment_id", referencedColumnName="id", nullable=false)
  48.   *
  49.   */
  50. protected $orderShipment;
  51.  
  52. /**
  53.   * @Assert\NotBlank
  54.   * @ORM\ManyToOne(targetEntity="OrdersStatus", inversedBy="orders")
  55.   * @ORM\JoinColumn(name="order_status_id", referencedColumnName="id", nullable=false)
  56.   *
  57.   */
  58. protected $orderStatus;
  59.  
  60. /**
  61.   * @ORM\ManyToMany(targetEntity="Products", mappedBy="orders")
  62.   */
  63. private $products;
  64. /**
  65.   * Constructor
  66.   */
  67. public function __construct()
  68. {
  69. $this->products = new \Doctrine\Common\Collections\ArrayCollection();
  70. }
  71.  
  72. /**
  73.   * Set userId
  74.   *
  75.   * @param \Ml\FrontendBundle\Entity\Orders $userId
  76.   *
  77.   * @return Orders
  78.   */
  79. public function setUserId(\Ml\FrontendBundle\Entity\Orders $userId)
  80. {
  81. $this->user_id = $userId;
  82.  
  83. return $this;
  84. }
  85.  
  86. /**
  87.   * Get userId
  88.   *
  89.   * @return \Ml\FrontendBundle\Entity\Orders
  90.   */
  91. public function getUserId()
  92. {
  93. return $this->user_id;
  94. }
  95.  
  96. /**
  97.   * Set user
  98.   *
  99.   * @param \Ml\UserBundle\Entity\User $user
  100.   *
  101.   * @return Orders
  102.   */
  103. public function setUser(\Ml\UserBundle\Entity\User $user)
  104. {
  105. $this->user = $user;
  106.  
  107. return $this;
  108. }
  109.  
  110. /**
  111.   * Get user
  112.   *
  113.   * @return \Ml\UserBundle\Entity\User
  114.   */
  115. public function getUser()
  116. {
  117. return $this->user;
  118. }
  119. }



Fragment kodu w kontrolerze obslugujacym zamowienia:
  1. $manager = $this->getDoctrine()->getManager();
  2. $order = new Orders();
  3.  
  4. $orderPaymentId = $request->get('opid');
  5. $paymentEntity = $manager->getRepository('MlFrontendBundle:Payments')->find($orderPaymentId);
  6. $order->setOrderPaymentId($paymentEntity);
  7. $orderShipmentId = $request->get('osid');
  8. $shipmentEntity = $manager->getRepository('MlFrontendBundle:Shipments')->find($orderShipmentId);
  9. $order->setOrderShipmentId($shipmentEntity);
  10.  
  11. $userId = $this->getUser()->getId(); // poprawnie zwraca id zalogowanego uzytkownika
  12. $userEntity = $manager->getRepository('MlUserBundle:User')->findOneById($userId); // zwraca obiekt
  13. $order->setUserId($userEntity); // problem z zapisem wartości
  14.  
  15. $manager->persist($order);
  16. $manager->flush();


Podczas próby zapisu id użytkownika dostaję monit: "Argument 1 passed to Ml\FrontendBundle\Entity\Orders::setUserId() must be an instance of Ml\FrontendBundle\Entity\Orders, instance of Ml\UserBundle\Entity\User given, called in Ml\OrderBundle\Controller\DefaultController.php"


Gdzie robię błąd? Proszę o pomoc.
ohm
1. public function setUserId(\Ml\FrontendBundle\Entity\Orders $userId)
Jak widać, $userId ma być obiektem typu Orders, co sam php mówi
Możesz usunąć (jeśli nie dokonywałeś modyfikacji) gettery i settery i wygeneruj ponownie przez doctrine:generate:entities oraz sprawdzaj poprawność relacji przez doctrine:schema:validate
2. Wystarczy że przekażesz $setUser($this->getUser()), nie musisz ponownie wygrzebywać użytkownika z bazy.
3. Nie robi się setUserId tylko robisz relację dla User (set/getUser()) <-> Order (getOrders(), addOrder(), removeOrder()),
swiezak
Dziekuje za pomoc.
lukaskolista
W kontrolerze masz:
  1. $paymentEntity = $manager->getRepository('MlFrontendBundle:Payments')->find($orderPaymentId);
  2. $order->setOrderPaymentId($paymentEntity);

Jest taka zasada, że funkcje z przedrostkiem get muszą zwrócić to, co powinny, a jeśli nie są w stanie, to powinny rzucić wyjątek. Jest też zasada mówiąca o tym, że funkcje z przedrostkiem find w przypadku, gdy nie znajdą tego, co powinny zwracają null. Powinienieś to obsłużyć rzucając wyjątek NotFoundException w przypadku braku tych obiektów w bazie. W przeciwnym przypadku dla id wpisanego złośliwie np. "abc" w $order->setOrderPaymentId($paymentEntity); ustawisz null, a chyba tak nie powinno być.

Żeby uniknąć rzeźbienia ifów możesz użyć np. adnotacji @ParamConverter.
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-2024 Invision Power Services, Inc.