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

Collection - dodawanie danych z JSON

VPS Starter Arubacloud
0 głosów
151 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 171 wizyt
pytanie zadane 28 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 31 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
–1 głos
1 odpowiedź 135 wizyt
pytanie zadane 14 października 2021 w PHP przez Dick91a Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...