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

Collection - dodawanie danych z JSON

Object Storage Arubacloud
0 głosów
163 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 176 wizyt
pytanie zadane 28 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 31 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
–1 głos
1 odpowiedź 142 wizyt
pytanie zadane 14 października 2021 w PHP przez Dick91a Nowicjusz (120 p.)

92,684 zapytań

141,589 odpowiedzi

320,073 komentarzy

62,044 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

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!

...