Zend OneToMany and ManyToOne

OneToMany and ManyToOne Relationship: User ↔ Order

  • One User can have many Orders
  • One Order belongs to one User

Step-by-Step Demo (Zend + Doctrine)

1. Inject EntityManager in Controller

Inject EntityManager link


2. Create User Entity (module\Application\src\Entity\User.php)

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{
    /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */
    private $id;

    /** @ORM\Column(type="string") */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Order", mappedBy="user", cascade={"persist", "remove"})
     */
    private $orders;

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

    // Getters and Setters
    public function getId(): ?int { return $this->id; }
    public function getName(): ?string { return $this->name; }
    public function setName(string $name): self { $this->name = $name; return $this; }

    public function getOrders() { return $this->orders; }
    public function addOrder(Order $order): self {
        $this->orders[] = $order;
        $order->setUser($this);
        return $this;
    }
}


3. Create Order Entity (module\Application\src\Entity\Order.php)

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="orders")
 */
class Order
{
    /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */
    private $id;

    /** @ORM\Column(type="string") */
    private $product;

    /** @ORM\Column(type="float") */
    private $amount;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="orders")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $user;

    // Getters and Setters
    public function getId(): ?int { return $this->id; }
    public function getProduct(): ?string { return $this->product; }
    public function setProduct(string $product): self { $this->product = $product; return $this; }

    public function getAmount(): ?float { return $this->amount; }
    public function setAmount(float $amount): self { $this->amount = $amount; return $this; }

    public function getUser(): ?User { return $this->user; }
    public function setUser(User $user): self { $this->user = $user; return $this; }
}


4. Generate Migration

Run this in terminal:

php vendor/bin/doctrine-migrations diff


5. Run Migration

php vendor/bin/doctrine-migrations migrate


This will create:

  • users
  • orders



Create (Insert) – Saving User with Orders

$user = new User();
$user->setName('Sathish');

// Create multiple orders
$order1 = new Order();
$order1->setProduct('T-shirt')->setAmount(499);

$order2 = new Order();
$order2->setProduct('Shoes')->setAmount(1299);

// Associate orders with user
$user->addOrder($order1);
$user->addOrder($order2);

// Save
$this->entityManager->persist($user); // Orders are automatically persisted because of cascade
$this->entityManager->flush();

Fetch all users with order:

$users = $this->entityManager->getRepository(User::class)->findAll();
foreach ($users as $user) {
    echo "User: " . $user->getName() . "<br>";
    foreach ($user->getOrders() as $order) {
        echo "Product: " . $order->getProduct() . " - ₹" . $order->getAmount() . "<br>";
    }
}


Fetch User  with Orders

$user = $this->entityManager->getRepository(User::class)->find(1);
echo "User: " . $user->getName() . "<br>";
foreach ($user->getOrders() as $order) {
  echo "Product: " . $order->getProduct() . " - ₹" . $order->getAmount() . "<br>";
}


Fetch All Orders

$orders = $this->entityManager->getRepository(Order::class)->findAll();
foreach ($orders as $order) {
  echo "Order #" . $order->getId() . ": " . $order->getProduct() . " ₹" . $order->getAmount();
  echo " (User: " . $order->getUser()->getName() . ")<br>";
}


Fetch One Order

$order = $this->entityManager->getRepository(Order::class)->find(1);

echo "Order: " . $order->getProduct() . "<br>";
echo "Amount: ₹" . $order->getAmount() . "<br>";
echo "User: " . $order->getUser()->getName();



Update User and Order

$user = $this->entityManager->getRepository(User::class)->find(1);
$user->setName("Updated Name");
$order = $this->entityManager->getRepository(Order::class)->find(1);
$order->setAmount(599);
$this->entityManager->flush();

Delete a User (and cascade delete orders)

$user = $this->entityManager->getRepository(User::class)->find(1);
$this->entityManager->remove($user);
$this->entityManager->flush();


Delete an Order

$order = $this->entityManager->getRepository(Order::class)->find(1);

if ($order) {
  $this->entityManager->remove($order);
  $this->entityManager->flush();

  echo "Order deleted.";
}

Optional: Repository DQL to Join for eager loading

$results = $entityManager->createQuery(
  'SELECT u, o FROM Application\Entity\User u JOIN u.orders o WHERE u.id = :id'
)->setParameter('id', 1)->getResult();

Whereisstuff is simple learing platform for beginer to advance level to improve there skills in technologies.we will provide all material free of cost.you can write a code in runkit workspace and we provide some extrac features also, you agree to have read and accepted our terms of use, cookie and privacy policy.
© Copyright 2024 www.whereisstuff.com. All rights reserved. Developed by whereisstuff Tech.