Фильтровать отношение коллекции массива - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь отфильтровать коллекцию, возвращенную родительской базой сущностей, по нескольким условиям, относящимся к другой сущности (пользователю).

По сути, я хочу, чтобы API PLATFORM возвращал сообщения только от текущего подключенного пользователя.

Вот мой объект с именем File (очень упрощенный для глобального понимания)

<?php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Annotation\Groups;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use App\Controller\FileCreatePdfController;
use Ramsey\Uuid\Uuid;
use Gedmo\Mapping\Annotation as Gedmo;



/**
 * @ApiResource(
*
 *     normalizationContext={"groups"={"file"},"enable_max_depth"=true},
 *     denormalizationContext={"groups"={"file-write"},"enable_max_depth"=true},
 *     attributes={"force_eager"=false},
 * )
 * @ApiFilter(SearchFilter::class, properties={"status": "exact"})
 * @ApiFilter(DateFilter::class, properties={"updatedAt"})
 * @ORM\Entity
 * @ORM\Table(name="cases")
 */
class File
{

    public function __construct()
    {
        $this->id = Uuid::uuid4();
        $this->messages = new ArrayCollection();
    }

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


    /**
     * @ORM\Id
     * @ORM\Column(type="uuid", unique=true)
     */
    private $id;

    /**
     * @var Collection|FileMessage[]
     *
     * @Groups({"file"})
     * @ORM\OneToMany(targetEntity="App\Entity\FileMessage", mappedBy="file")
     */
    private $messages;


    /**
     * @return Collection|FileMessage[]
     */
    public function getMessages(): Collection
    {
        return $this->messages;
    }


    /**
     * @param FileMessage $message
     * @return File
     */
    public function addMessage(FileMessage $message): self
    {
        if (false === $this->messages->contains($message)) {
            $this->messages->add($message);
        }
        return $this;
    }




}

Мой файл содержит несколько сообщений из FileMessage (очень упрощенный для общего понимания

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Ramsey\Uuid\Uuid;


/**
 * @ApiResource(
 *     normalizationContext={"groups"={"file-message"}, "enable_max_depth"=true},
 *     denormalizationContext={"groups"={"file-message-write"}, "enable_max_depth"=true},
 *     attributes={"force_eager"=false}
 * )
 * @ORM\Entity
 * @ORM\Table(name="`file_messages`")
 */

class FileMessage {

    /**
     *
     * @ORM\Id
     * @ORM\Column(type="uuid", unique=true)
     */
    private $id;

    /**
     * @var File
     *
     * @ORM\ManyToOne(targetEntity="File", cascade={"persist"}, inversedBy="messages")
     * @Assert\Valid
     * @Groups({"file-message", "file-message-write","file"})
     */
    private $file;


    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="User", cascade={"persist"}, inversedBy="messages")
     * @Assert\Valid
     * @Groups({"file-message", "file-message-write","file"})
     */
    private $user;


    public function __construct()
    {
        $this->id = Uuid::uuid4();
    }

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


    public function getFile(): ?File
    {
        return $this->file;
    }

    public function setFile(?File $file): self
    {
        $this->file = $file;

        return $this;
    }

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

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

        return $this;
    }



}

Каждый сообщение отправлено указанным c пользователем (другой пользователь сущности), я не думаю, что необходимо публиковать содержимое этой сущности.

Когда я получаю указанный файл c, url / files / [file_id]

Отображаются все сообщения для всех пользователей, я хочу скрыть все сообщения, которые не относятся к подключенному пользователю

enter image description here

Решение, которое я пробовал до сих пор:

  • Расширения , я фильтрую только файлы /, которые я получаю, но не коллекцию сообщений
  • Пользовательский фильтр s , кажется, не присваивается
  • Фильтрация коллекций , кажется идеальной только при фильтрации по свойствам текущего класса, в моем случае мне нужно отфильтровать свойства на основе другого класса content (Пользователь).

Есть ли у меня какое-либо решение? Я подумал, может быть, использовать слушатель событий

1 Ответ

1 голос
/ 16 января 2020

Расширения - это путь к go. Они предоставляют вам доступ к Doctrine ORM Query Builder, поэтому вы можете фильтровать как текущий ресурс, так и его отношения, изменяя условие WHERE запроса DQL. Всегда лучше фильтровать данные как можно раньше (из-за производительности, среди прочих причин), поэтому здесь лучше всего делать это на уровне СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...