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

Collection - dodawanie danych z JSON

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
223 wizyt
pytanie zadane 25 marca 2021 w PHP przez Ambroz Obywatel (1,840 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 2021 przez Ambroz Obywatel (1,840 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 2021 przez Michał Kazula Pasjonat (19,540 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 2021 przez Ambroz Obywatel (1,840 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 2021 przez Michał Kazula Pasjonat (19,540 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 194 wizyt
pytanie zadane 28 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 31 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
–1 głos
1 odpowiedź 235 wizyt
pytanie zadane 14 października 2021 w PHP przez Dick91a Nowicjusz (120 p.)

93,174 zapytań

142,185 odpowiedzi

321,970 komentarzy

62,503 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1157p. - dia-Chann
  2. 1139p. - Łukasz Piwowar
  3. 1131p. - CC PL
  4. 1126p. - Łukasz Eckert
  5. 1118p. - Tomasz Bielak
  6. 1104p. - Michal Drewniak
  7. 1083p. - Marcin Putra
  8. 1078p. - rucin93
  9. 1071p. - rafalszastok
  10. 1054p. - Adrian Wieprzkowicz
  11. 1047p. - Piotr Aleksandrowicz
  12. 1037p. - Michał Telesz
  13. 1023p. - Mariusz Fornal
  14. 1017p. - Mikbac
  15. 1005p. - ssynowiec
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 polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...