如何用symfony附加用户创建对象

时间:2018-08-21 06:08:17

标签: php symfony

我正在尝试创建当前经过身份验证的用户创建的产品。

用户与产品实体有关系,我需要为用户提供一种与其相关联的用户创建产品的方法。

我正在关注此tutorial,但没有介绍如何与当前用户一起存储产品

这是我到目前为止所拥有的

ProductController.php

  public function create(Request $request)
    {

      $category = new Category();
      $category->setName($request->get('category'));

      $user = new User();
      // how would i get the current user and set it to a product.
      $entityManager = $this->getDoctrine()->getManager();

      $product = new Product();
      $product->setName($request->get('title'));
      $product->setPrice($request->get('price'));
      $product->setDescription($request->get('description'));

      $product->setCategory($category);

      $entityManager->persist($category);
      $entityManager->persist($product);
      $entityManager->flush();


      return $this->redirectToRoute('products');

    }

我应该使用这种方法还是尝试其他方法?

Entity \ User.php

public function addProduct(Product $product): self
{
    if (!$this->products->contains($product)) {
        $this->products[] = $product;
        $product->setUser($this);
    }

    return $this;
}

Entity \ Product.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\Column(type="integer")
     */
    private $price;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="products")
     * @ORM\JoinColumn(nullable=false)
     */
    private $category;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="products")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    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 getPrice(): ?int
    {
        return $this->price;
    }

    public function setPrice(int $price): self
    {
        $this->price = $price;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getCategory(): ?Category
    {
        return $this->category;
    }

    public function setCategory(?Category $category): self
    {
        $this->category = $category;

        return $this;
    }

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

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

        return $this;
    }
}

1 个答案:

答案 0 :(得分:4)

如我所见,您的关系通过addProduct()方法工作,但是在您的控制器中,您不会在任何地方调用addProduct()

尝试关注...

$entityManager->persist($user) // you forgot to persist a new User
$entityManager->persist($category);
$entityManager->persist($product);
$user->addProduct(product)
$entityManager->flush(); // now try to flush...

离题和一点 建设性的批评

仅通过查看您的控制器,我就假定您正在使用Symfony,尤其是在学习原理方面。如果是这样,请考虑以下。如果不是,那就忽略它;)

  • Product->user重命名为Product->createdBy,这种命名约定使其更加明显。
  • 在这种情况下,最好从双向关系(当前状态)切换为单向关系(谷歌,但简而言之->仅丢弃产品中的inversedBymappedBy部分) <->用户关系)
相关问题