Как отфильтровать текущего пользователя от EntityType? (Symfony форм) - PullRequest
0 голосов
/ 13 апреля 2020

Я создал форму ConversationFormType, в которой я хочу, чтобы все друзья этого пользователя выбрали несколько вариантов выбора (EntityType).

Проблема в сгенерированном выборе, включающем текущего пользователя и его друзей. Есть ли способ, которым я могу отфильтровать текущего пользователя из вывода?

Заранее спасибо.

Form \ ConversationFormType. php

 public function buildForm(FormBuilderInterface $builder, array $options)
        {       
            $builder
                ->add('name', TextType::class,[
                    'label'=>'Conversation title'
                ])
                ->add('Users', EntityType::class, [
                    'label' => 'invite a friend to this conversation',
                    'attr'=>['class'=>'form-control'],
                    'class' => Friendship::class,
                    'choice_label' => 'friend.fullName',
                    'multiple'=>true,
                ]);
        }
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Conversation::class,
    ]);
}

Entity \ Friendship . php

/**
 * @ORM\Entity(repositoryClass="App\Repository\FriendshipRepository")
 */
class Friendship
{

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="friendships")
     * @ORM\Id
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="friendsWithMe")
     * @ORM\Id
     */
    public $friend;

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

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

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

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

        return $this;
    }

    public function getFriend(): ?User
    {
        return $this->friend;
    }

    public function setFriend(?User $friend): self
    {
        $this->friend = $friend;

        return $this;
    }

    public function getDate(): ?\DateTimeInterface
    {
        return $this->date;
    }

    public function setDate(\DateTimeInterface $date): self
    {
        $this->date = $date;

        return $this;
    }
}

Entity \ Conversation. php

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

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="conversations")
     */
    private $Users;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Message", mappedBy="conversation")
     */
    private $Messages;

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

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

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

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

    /**
     * @return Collection|User[]
     */
    public function getUsers(): Collection
    {
        return $this->Users;
    }

    public function addUser(User $user): self
    {
        if (!$this->Users->contains($user)) {
            $this->Users[] = $user;
        }

        return $this;
    }

    public function removeUser(User $user): self
    {
        if ($this->Users->contains($user)) {
            $this->Users->removeElement($user);
        }

        return $this;
    }

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

    public function addMessage(Message $message): self
    {
        if (!$this->Messages->contains($message)) {
            $this->Messages[] = $message;
            $message->setConversation($this);
        }

        return $this;
    }

    public function removeMessage(Message $message): self
    {
        if ($this->Messages->contains($message)) {
            $this->Messages->removeElement($message);
            // set the owning side to null (unless already changed)
            if ($message->getConversation() === $this) {
                $message->setConversation(null);
            }
        }

        return $this;
    }

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

    public function setName(?string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSlug(): ?string
    {
        return $this->slug;
    }

    public function setSlug(string $slug): self
    {
        $this->slug = $slug;

        return $this;
    }
}

Обновление

добавлен построитель запросов, так как предложение все еще получалось те же результаты:

'query_builder' => function (EntityRepository $er) use ($user) { 
     return $er->createQueryBuilder('none')
     ->from(Friendship::class,'friendship')
     ->where('friendship.user != friendship.friend')
     ->andWhere('friendship.user != :user')
     ->setParameter('user', $user);
},
...