【问题标题】:symfony CRUD Insert json, some doesn't get insertedsymfony CRUD 插入 json,有些没有被插入
【发布时间】:2020-06-13 00:08:56
【问题描述】:

所以我正在尝试创建一个将Recipies 插入 MySQL 数据库的方法。

recipe (Recette) 有多个Ingredients 的项目架构。

Recette 有一个 Title(titre)、Subtitle(Soustitre) 和 Ingredients 必须插入“POST”请求中以及我得到的结果。

另外,我同样的代码有一个更新功能也不好用,而且总是成分的问题。

这是我的控制器:

namespace App\Controller;

use App\Entity\Ingredients;
use App\Entity\Recettes;
use Doctrine\ORM\EntityManagerInterface;
use http\Env\Response;
use Psr\Container\ContainerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\RecettesRepository;
use Symfony\Component\Serializer\Exception\NotEncodableValueException;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;


class ApiRecetteController extends AbstractController
{
/**
 * @Route("/api/recette", name="api_recette_index", methods={"GET"})
 */
public function index(RecettesRepository $recettesRepository)
{
    return $this->json($recettesRepository->findAll(), 200, [], ['groups' => 'recette:read']);

}
/**
 * @Route("/api/recette", name="api_recette_addRecettes", methods={"POST"})
 */
public function addRecettes(Request $request, SerializerInterface $serializer, EntityManagerInterface 
$entityManager)
{

    $jsonRecu = $request->getContent();
    try {
        $recette = $serializer->deserialize($jsonRecu, Recettes::class,"json");
        $entityManager->persist($recette);
        $entityManager->flush();
        return $this->json($recette,201);
    }
    catch (NotEncodableValueException $e){
        return $this->json([
            'status'=>400,
            'message' =>$e->getMessage()
        ],400);
    }
}

/**
 * @Route("/api/recette/Update/{id}", name="api_recette_updateRecettes", methods={"PUT"})
 */
public function UpdateRecettes($id, RecettesRepository $recettesRepository, Request $request, 
EntityManagerInterface $entityManager)
{
    $entityManger = $this->getDoctrine()->getManager();
    $recettes = $entityManger->getRepository(Recettes::class)->find($id);

    $data = json_decode($request->getContent(), true);
    if (!$recettes) {
        throw  $this->createNotFoundException(
            'Aucune recette trouvé pour id' . $id
        );
    }
    empty($data['Titre']) ? true : $recettes->setTitre($data['Titre']);
    empty($data['Soustitre']) ? true : $recettes->setSoustitre($data['Soustitre']);
    $entityManager->persist($recettes);
    $entityManger->flush();
    return $this->json($recettes,204, [], ['groups' => 'recette:read']);

}

/**
 * @Route("/api/recette/{id}", name="api_recette_DeleteRecettes", methods={"DELETE"})
 */

public function DeleteRecettes($id, EntityManagerInterface $entityManager, Request $request)
{
    $recettes = $entityManager->getRepository(Recettes::class)->find($id);
    $entityManager->remove($recettes);
    $entityManager->flush();

    return $this->json($recettes,202, [], ['groups' => 'recette:read']);

   }

}

和我的两个实体

<?PHP

namespace App\Entity;

use App\Repository\IngredientsRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;


/**
 * @ORM\Entity(repositoryClass="App\Repository\IngredientsRepository", 
  repositoryClass=IngredientsRepository::class)
 */
 class Ingredients
 {
 /**
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 * @Groups("recette:read")
 */
private $id;

/**
 * @ORM\Column(type="string", length=255)
 * @Groups("recette:read")
 */
private $name;

/**
 * @ORM\ManyToOne(targetEntity=Recettes::class, inversedBy="ingredients")
 * @ORM\JoinColumn(nullable=false)
 */
private $recettes;

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 getRecettes(): ?Recettes
{
    return $this->recettes;
}

public function setRecettes(?Recettes $recettes): self
{
    $this->recettes = $recettes;

    return $this;
}
public function __toString(): ?string
{
    return $this->getName();
}


}

和背带

<?PHP

namespace App\Entity;

use App\Repository\RecettesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

/**
* @ORM\Entity(repositoryClass=RecettesRepository::class)
*/
class Recettes
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 * @Groups("recette:read")
 */
private $id;

/**
 * @ORM\Column(type="string", length=255)
 * @Groups("recette:read")
 */
private $Titre;

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 * @Groups("recette:read")
 */
private $Soustitre;

/**
 * @ORM\OneToMany(targetEntity=Ingredients::class, mappedBy="recettes")
 */
private $ingredients;



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



public function getId(): ?int
{
    return $this->id;
}


public function getTitre(): ?string
{
    return $this->Titre;
}

public function setTitre(string $Titre): self
{
    $this->Titre = $Titre;

    return $this;
}

public function getSoustitre(): ?string
{
    return $this->Soustitre;
}

public function setSoustitre(?string $Soustitre): self
{
    $this->Soustitre = $Soustitre;

    return $this;
}

/**
 * @return Collection|Ingredients[]
 */
public function getingredients(): Collection
{
    return $this->ingredients;
}

public function addingredients(Ingredients $ingredients): self
{
    if (!$this->ingredients->contains($ingredients)) {
        $this->ingredients[] = $ingredients;
        $ingredients->setRecettes($this);
    }

    return $this;
}

public function removeingredients(Ingredients $ingredients): self
{
    if ($this->ingredients->contains($ingredients)) {
        $this->ingredients->removeElement($ingredients);
        // set the owning side to null (unless already changed)
        if ($ingredients->getRecettes() === $this) {
            $ingredients->setRecettes(null);
        }
    }

    return $this;
}


}

我的请求 json

JSON Row Request

我的回复状态为 201 正常,但插入了空成分

Response From Server

【问题讨论】:

  • 尝试在此行之前添加dd( $recette-&gt;getingredients()) ;$entityManager-&gt;persist($recette);

标签: php symfony serialization crud


【解决方案1】:

要插入相关实体,您需要将cascade={"persist"} 设置为您的关系,即:

/**
 * @ORM\OneToMany(targetEntity=Ingredients::class, mappedBy="recettes", cascade={"persist"})
 */
private $ingredients;

否则,您需要先持久化 Recettes,获取 id 并将其设置在您的成分上,然后再持久化它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2017-10-23
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多