Reputation: 9
I'm new in Symfony 6 and I have to create a database structure using api platform
I want to create a table named Place and that place has photos like oneToMany relationship also each place has a address and location and belong to a sellerUser oneToOne but can be null
The selleruser extends by User and there are two type users as SellerUser and CustomeUser
Also each user has a photo, address, location, (string) name, surname, email, password
And I want to use uuid generated by constructor and the owners has a primary key and property objects has a foreign key. I couldn't implement it.
these are my entities:
User.php :
<?php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: UserRepository::class)]
class User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 100)]
private ?string $name = null;
#[ORM\Column(length: 100)]
private ?string $surname = null;
#[ORM\Column(length: 50)]
private ?string $email = null;
#[ORM\Column(length: 255)]
private ?string $password = null;
#[ORM\Column]
private ?\DateTimeImmutable $registrationDate = null;
#[ORM\OneToMany(mappedBy: 'owner', targetEntity: Photo::class)]
private Collection $photos;
#[ORM\OneToMany(mappedBy: 'owner', targetEntity: Address::class)]
private Collection $address;
public function __construct()
{
$this->photos = new ArrayCollection();
$this->address = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
public function getSurname(): ?string
{
return $this->surname;
}
public function setSurname(string $surname): static
{
$this->surname = $surname;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): static
{
$this->email = $email;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): static
{
$this->password = $password;
return $this;
}
public function getRegistrationDate(): ?\DateTimeImmutable
{
return $this->registrationDate;
}
public function setRegistrationDate(\DateTimeImmutable $registrationDate): static
{
$this->registrationDate = $registrationDate;
return $this;
}
/**
* @return Collection<int, Photo>
*/
public function getPhotos(): Collection
{
return $this->photos;
}
public function addPhoto(Photo $photo): static
{
if (!$this->photos->contains($photo)) {
$this->photos->add($photo);
$photo->setOwner($this);
}
return $this;
}
public function removePhoto(Photo $photo): static
{
if ($this->photos->removeElement($photo)) {
// set the owning side to null (unless already changed)
if ($photo->getOwner() === $this) {
$photo->setOwner(null);
}
}
return $this;
}
/**
* @return Collection<int, Address>
*/
public function getAddress(): Collection
{
return $this->address;
}
public function addAddress(Address $address): static
{
if (!$this->address->contains($address)) {
$this->address->add($address);
$address->setOwner($this);
}
return $this;
}
public function removeAddress(Address $address): static
{
if ($this->address->removeElement($address)) {
// set the owning side to null (unless already changed)
if ($address->getOwner() === $this) {
$address->setOwner(null);
}
}
return $this;
}
}
CustomerUser.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\CustomerUserRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: CustomerUserRepository::class)]
#[ApiResource]
class CustomerUser extends User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
public function getId(): ?int
{
return $this->id;
}
}
SellerUser.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\SellerUserRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: SellerUserRepository::class)]
#[ApiResource]
class SellerUser extends User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
private ?Place $place = null;
public function getId(): ?int
{
return $this->id;
}
public function getPlace(): ?Place
{
return $this->place;
}
public function setPlace(?Place $place): static
{
$this->place = $place;
return $this;
}
}
Place.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\PlaceRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: PlaceRepository::class)]
#[ApiResource]
class Place
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 100)]
private ?string $name = null;
#[ORM\OneToMany(mappedBy: 'place', targetEntity: Photo::class)]
private Collection $photos;
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
private ?Address $address = null;
#[ORM\OneToOne(inversedBy: 'place', cascade: ['persist', 'remove'])]
#[ORM\JoinColumn(nullable: false)]
private ?Location $location = null;
public function __construct()
{
$this->photos = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
/**
* @return Collection<int, Photo>
*/
public function getPhotos(): Collection
{
return $this->photos;
}
public function addPhoto(Photo $photo): static
{
if (!$this->photos->contains($photo)) {
$this->photos->add($photo);
$photo->setPlace($this);
}
return $this;
}
public function removePhoto(Photo $photo): static
{
if ($this->photos->removeElement($photo)) {
// set the owning side to null (unless already changed)
if ($photo->getPlace() === $this) {
$photo->setPlace(null);
}
}
return $this;
}
public function getAddress(): ?Address
{
return $this->address;
}
public function setAddress(?Address $address): static
{
$this->address = $address;
return $this;
}
public function getLocation(): ?Location
{
return $this->location;
}
public function setLocation(Location $location): static
{
$this->location = $location;
return $this;
}
}
Photo.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\PhotoRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: PhotoRepository::class)]
#[ApiResource]
class Photo
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $uri = null;
#[ORM\ManyToOne(inversedBy: 'photos')]
#[ORM\JoinColumn(nullable: false)]
private ?User $owner = null;
#[ORM\ManyToOne(inversedBy: 'photos')]
private ?Place $place = null;
public function getId(): ?int
{
return $this->id;
}
public function getUri(): ?string
{
return $this->uri;
}
public function setUri(string $uri): static
{
$this->uri = $uri;
return $this;
}
public function getOwner(): ?User
{
return $this->owner;
}
public function setOwner(?User $owner): static
{
$this->owner = $owner;
return $this;
}
public function getPlace(): ?Place
{
return $this->place;
}
public function setPlace(?Place $place): static
{
$this->place = $place;
return $this;
}
}
Location.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\LocationRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: LocationRepository::class)]
#[ApiResource]
class Location
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column]
private ?int $latitude = null;
#[ORM\Column]
private ?int $longitude = null;
#[ORM\OneToOne(mappedBy: 'location', cascade: ['persist', 'remove'])]
private ?Place $place = null;
public function getId(): ?int
{
return $this->id;
}
public function getLatitude(): ?int
{
return $this->latitude;
}
public function setLatitude(int $latitude): static
{
$this->latitude = $latitude;
return $this;
}
public function getLongitude(): ?int
{
return $this->longitude;
}
public function setLongitude(int $longitude): static
{
$this->longitude = $longitude;
return $this;
}
public function getPlace(): ?Place
{
return $this->place;
}
public function setPlace(Place $place): static
{
// set the owning side of the relation if necessary
if ($place->getLocation() !== $this) {
$place->setLocation($this);
}
$this->place = $place;
return $this;
}
}
Address.php:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\AddressRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: AddressRepository::class)]
#[ApiResource]
class Address
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 100)]
private ?string $country = null;
#[ORM\Column(length: 100, nullable: true)]
private ?string $city = null;
#[ORM\Column(length: 100, nullable: true)]
private ?string $district = null;
#[ORM\Column(length: 20, nullable: true)]
private ?string $postCode = null;
#[ORM\ManyToOne(inversedBy: 'address')]
private ?User $owner = null;
public function getId(): ?int
{
return $this->id;
}
public function getCountry(): ?string
{
return $this->country;
}
public function setCountry(string $country): static
{
$this->country = $country;
return $this;
}
public function getCity(): ?string
{
return $this->city;
}
public function setCity(?string $city): static
{
$this->city = $city;
return $this;
}
public function getDistrict(): ?string
{
return $this->district;
}
public function setDistrict(?string $district): static
{
$this->district = $district;
return $this;
}
public function getPostCode(): ?string
{
return $this->postCode;
}
public function setPostCode(?string $postCode): static
{
$this->postCode = $postCode;
return $this;
}
public function getOwner(): ?User
{
return $this->owner;
}
public function setOwner(?User $owner): static
{
$this->owner = $owner;
return $this;
}
}
I want to generate uuid using Ramsey\Uuid->uuid4() and make these relations by foreign key uuid, also I don't want to create table named user because I just want to use oop methods to not implement same things in seller and customer users
But when I migrate it the database generate user table, also the Photo and Address entities have two different fields for both place and user named owner and place but I want to just one variable named owner for two entity
Upvotes: 0
Views: 58