【发布时间】:2021-08-03 08:38:25
【问题描述】:
如何在不使用 API-Platform 删除相关资源的情况下选择资源? 我有这种关系 Don ManyTOOne Donateur。在 Don 资源中,我将 $isDeleted 作为字段。当它的值为 true 并尝试从 Donateur 中选择一个项目时,我明白了。 在此处显示:
// The GET operation http://localhost:8000/api/donateurs/3
{
"@context": "\/api\/contexts\/Donateur",
"@id": "\/api\/donateurs\/3",
"@type": "Donateur",
"id": 3,
"nom": "Yazid Ibn Amr",
"solde": 135000,
"isDeleted": false,
"dons": [
{
"@id": "\/api\/dons\/1",
"@type": "Don",
"id": 1,
"date": "2021-07-26T00:00:00+00:00",
"montant": 35000,
"isDeleted": true
},
{
"@id": "\/api\/dons\/2",
"@type": "Don",
"id": 2,
"date": "2021-07-28T00:00:00+00:00",
"montant": 60000,
"isDeleted": false
},
{
"@id": "\/api\/dons\/3",
"@type": "Don",
"id": 3,
"date": "2021-07-28T00:00:00+00:00",
"montant": 75000,
"isDeleted": false
}
]
}
在获取 Donateur 项目时,我不需要在此返回的 Don 集合中删除资源。
这是我的代码
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\DonRepository;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(
* normalizationContext={
* "groups"={
* "read:Don:item",
* "read:Don:collection"
* }
* },
* denormalizationContext={
* "groups"={
* "write:Don"
* }
* },
* collectionOperations={
* "get", "post"
* },
* itemOperations={
* "get"={
* "normalization_context"={
* "groups"={
* "read:Don:item",
* "read:Don:collection"
* }
* }
* },
* "patch", "delete"
* }
* )
* @ORM\Entity(repositoryClass=DonRepository::class)
*/
class Don
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"read:Donateur:item"})
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Donateur::class, inversedBy="dons")
* @ORM\JoinColumn(nullable=false)
* @Groups({"read:Don:collection", "write:Don"})
*/
private $donateur;
/**
* @ORM\Column(type="date", nullable=true)
* @Groups({"read:Don:collection", "write:Don", "read:Donateur:item"})
*/
private $date;
/**
* @ORM\Column(type="float")
* @Groups({"read:Don:collection", "write:Don", "read:Donateur:item"})
*/
private $montant;
和
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\DonateurRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(
* normalizationContext={
* "groups"={
* "read:Donateur:item",
* "read:Donateur:collection"
* }
* },
* denormalizationContext={
* "groups"={
* "write:Donateur"
* }
* },
* collectionOperations={
* "get", "post"
* },
* itemOperations={
* "get", "patch", "delete"
* }
* )
* @ORM\Entity(repositoryClass=DonateurRepository::class)
*/
class Donateur
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups("read:Donateur:collection")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"read:Donateur:collection", "write:Donateur"})
*/
private $nom;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({"read:Donateur:collection", "write:Donateur"})
*/
private $presentation;
/**
* @ORM\Column(type="float")
* @Groups({"read:Donateur:collection", "write:Don"})
*/
private $solde;
/**
* @ORM\Column(type="boolean")
* @Groups("read:Donateur:collection")
*/
private $isDeleted;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $createdAt;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $createdBy;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $updatedBy;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $deletedAt;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $deletedBy;
/**
* @ORM\OneToMany(targetEntity=Don::class, mappedBy="donateur")
* @Groups({"read:Donateur:item"})
*/
private $dons;
还有这个
<?php
namespace App\Doctrine;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
use Doctrine\ORM\QueryBuilder;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Entity\Don;
use App\Entity\Donateur;
use App\Entity\TypeOeuvre;
class NoneDeletedResources implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
public function addWhere(QueryBuilder $queryBuilder, string $resourceClass)
{
if($resourceClass === TypeOeuvre::class or $resourceClass === Don::class or $resourceClass === Donateur::class){
$rootAlias = $queryBuilder->getRootAliases()[0];
$queryBuilder->andWhere("$rootAlias.isDeleted = :isDeleted");
$queryBuilder->orderBy("$rootAlias.id", "DESC");
$queryBuilder->setParameter("isDeleted", false);
}
}
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?string $operationName = null)
{
$this->addWhere($queryBuilder, $resourceClass);
}
public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?string $operationName = null, array $context = [])
{
// dd($context);
$this->addWhere($queryBuilder, $resourceClass);
}
}
感谢您的帮助
【问题讨论】:
-
我的回答对您有帮助吗?如果没有,请告诉我如何改进我的答案。
-
它适用于这种关系。但是当我尝试执行另一个时它不起作用并且我得到一个错误。
-
当然,我没有写你所有的查询;)但很高兴听到它对你有帮助。
标签: symfony doctrine-orm doctrine api-platform.com