Фильтр symfony2 во многих отношениях

У меня есть объект с именем User, который имеет следующее:

class User implements UserInterface
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="string",length=100)
     **/
    protected $id_user;

    /** @ORM\Column(type="string")
     */
    protected $surname;

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

  /** 
     * @var ArrayCollection $friends
     * @ORM\ManyToMany(targetEntity="UniDocs\UserBundle\Entity\User")
     * @ORM\JoinTable(name="friends",
     *      joinColumns={@ORM\JoinColumn(name="friend1", referencedColumnName="id_user")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="friend2", referencedColumnName="id_user")}
     *      ) 
    */
    protected $friends; 

.
.
.

/**
     * Get friends
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getFriends()
    {
        return $this->friends;
    }

.
.
.
}

Мне нужно сделать запрос, который дает мне друзей пользователя, имя которого содержит букву "а" и фамилию букву "б" (например. Эти буквы указаны на фильтре в веб-форме).

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

1 ответ

Вы не можете сделать это с помощью геттеров, вам нужно написать метод репозитория и использовать этот метод для того, чтобы получить именно то, что вы ищете.

class FriendRepository extends EntityRepository
{
    public function findByUserAlphabetical(User $user)
    {
        // do query with alphabetical stuff
        return $query = ...
    }
}

Тогда по твоей логике

$friends = $friendRepository->findByUserAlphabetical($user);

$user->setFriends($friends);

Кроме того, вы захотите запретить выборку друзей в исходном запросе пользователя, чтобы вы могли установить аннотацию fetch ленивым

/** 
 * @var ArrayCollection $friends
 * @ORM\ManyToMany(targetEntity="UniDocs\UserBundle\Entity\User", fetch="LAZY")
 * @ORM\JoinTable(name="friends",
 *      joinColumns={@ORM\JoinColumn(name="friend1", referencedColumnName="id_user")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="friend2", referencedColumnName="id_user")}
 *      ) 
 */
 protected $friends; 
Другие вопросы по тегам