• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Collection - dodawanie danych z JSON

0 głosów
61 wizyt
pytanie zadane 25 marca w PHP przez Ambroz Obywatel (1,750 p.)

Cześć.
Ćwiczę sobie dodawanie danych do REST API w formacie JSON i trafiłem na problem, gdyż podczas odbieranie danych kolekcja jest pusta. Wszelkie fora jakie przejrzałem mówiły o dodawaniu za pomocą formularza, co tu nie występuje.

Otrzymywane dane w formacie JSON podzieliłem na 2 tabele: Orders i Realestate. Orders jest główną tabelą i ma w sobie odniesienie do Realestate, które jest w relacji Jeden do Wielu (Jeden Order ma wiele Realestate).

Właśnie w Order jest ta nieszczęsna kolekcja, która po próbie uzyskania danych za pomocą GET jest pusta.

Z góry dzięki za pomoc.

collection

Przykładowe dane:

{
"id": 100,
"assignee": "41f9de03-f0cb-451a-8e33-a87545b38528",
"author": "41f9de03-f0cb-451a-8e33-a87545b38528",
"realEstates": [
  {
    "type": "building",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
  }
],
"inspectionDate": "2020-01-01"
}

Entity Orders:
 

<?php

namespace App\Entity;

use App\Repository\OrdersRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=OrdersRepository::class)
 */
class Orders
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $assignee;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $author;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $inspectionDate;

    /**
     * @ORM\OneToMany(targetEntity=Realestate::class, mappedBy="orders")
     */
    private $realestate_id;

    public function __construct()
    {
        $this->realestate_id = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getAssignee(): ?string
    {
        return $this->assignee;
    }

    public function setAssignee(string $assignee): self
    {
        $this->assignee = $assignee;

        return $this;
    }

    public function getAuthor(): ?string
    {
        return $this->author;
    }

    public function setAuthor(string $author): self
    {
        $this->author = $author;

        return $this;
    }


    public function getInspectionDate(): ?string
    {
        return $this->inspectionDate;
    }

    public function setInspectionDate(string $inspectionDate): self
    {
        $this->inspectionDate = $inspectionDate;

        return $this;
    }
    /**
     * @return Collection|Realestate[]
     */
    public function getRealestateId(): Collection
    {
        return $this->realestate_id;
    }

    public function addRealestateId(Realestate $realestateId): self
    {
        if (!$this->realestate_id->contains($realestateId)) {
            $this->realestate_id[] = $realestateId;
            $realestateId->setOrders($this);
        }

        return $this;
    }

    public function removeRealestateId(Realestate $realestateId): self
    {
        if ($this->realestate_id->removeElement($realestateId)) {
            // set the owning side to null (unless already changed)
            if ($realestateId->getOrders() === $this) {
                $realestateId->setOrders(null);
            }
        }

        return $this;
    }
}

Entity Realestate:
 

<?php

namespace App\Entity;

use App\Repository\RealestateRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=RealestateRepository::class)
 */
class Realestate
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $type;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\ManyToOne(targetEntity=Orders::class, inversedBy="realestate_id")
     */
    private $orders;


    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getType(): ?string
    {
        return $this->type;
    }

    public function setType(string $type): self
    {
        $this->type = $type;

        return $this;
    }

    public function getOrders(): ?Orders
    {
        return $this->orders;
    }

    public function setOrders(?Orders $orders): self
    {
        $this->orders = $orders;

        return $this;
    }
}

 

komentarz 25 marca przez Ambroz Obywatel (1,750 p.)

Coś na co trafiłem, to jak wyciągam dane z bazy tym zapytaniem:
 

        return $this->createQueryBuilder('p')
            ->select('p')
                ->join(RealEstates::class,'c', 'WITH','p.id = c.realEstates')
                ->where('p.id = :id')
                ->setParameter('id', $productId)
                ->getQuery()->getResult();

Dostaje taką odpowiedź:
odpA

Natomiast jak tym zapytaniem:
 

        $query = $entityManager->createQuery(
            'SELECT p, c
            FROM App\Entity\Order p
            INNER JOIN p.realEstates c
            WHERE p.id = :id'
        )->setParameter('id', $productId);

        return $query->getOneOrNullResult();

Odpowiedź jest taka:
odpB

1 odpowiedź

0 głosów
odpowiedź 25 marca przez Michał Kazula Pasjonat (19,140 p.)
Na pewno masz relacje na modelach?

Pokaż jak wywołujesz get i który to get bo w Entity nie widzę połączenia między nimi.
komentarz 25 marca przez Ambroz Obywatel (1,750 p.)
/**
     * @return Collection|Realestate[]
     */
    public function getRealestateId(): Collection
    {
        return $this->realestate_id;
    }

 

Wywołanie:
 

    /**
     * @Route ("/get/{id}", name="get_all_data", methods={"GET"})
     * @param $id
     */
    public function getData($id){

        $getAllData = $this->getDoctrine()->getRepository(Orders::class)->findOneBy(['id'=>$id]);

        $getRealestate = $getAllData->getRealestateId();

        dump($getAllData);
        dump($getRealestate);die;
    }

 

komentarz 26 marca przez Michał Kazula Pasjonat (19,140 p.)
Ale getRealestateId() jest na Orders?

To nie zadziała. Kolekcja to zbiór obiektów danego typu. A Ty zwracasz id z relacji której nie ma. Albo coś źle zrozumiałem.

Możesz dać dostęp do repo? Bo te fragmenty mi nie pasują.

Podobne pytania

0 głosów
0 odpowiedzi 67 wizyt
pytanie zadane 28 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
1 odpowiedź 79 wizyt
pytanie zadane 31 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
–1 głos
1 odpowiedź 41 wizyt
pytanie zadane 14 października w PHP przez Dick91a Nowicjusz (120 p.)

85,875 zapytań

134,650 odpowiedzi

298,919 komentarzy

56,743 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 1048p. - rucin93
  2. 1042p. - Whistleroosh
  3. 989p. - adrian17
  4. 984p. - Mikbac
  5. 982p. - Mateusz Bogdan
  6. 912p. - nidomika
  7. 867p. - Michal Drewniak
  8. 859p. - CC PL
  9. 854p. - Argeento
  10. 704p. - ScriptyChris
  11. 692p. - s. Dorota Kowalewska
  12. 683p. - tokox
  13. 660p. - Vinox
  14. 645p. - TheLukaszNs
  15. 628p. - WhiskeyTaster
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...