Как отобразить данные пользователя c в списке на основе отношения «многие ко многим» с помощью Symfony 5 EasyAdmin Bundle - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в связке EasyAdmin. Я пытался загрузить содержимое c, указанное пользователем, в список вошедшего в систему пользователя.

Итак, вот мой composer.json файл:

{
"type": "project",
"license": "proprietary",
"require": {
    "php": "^7.2.5",
    "ext-ctype": "*",
    "ext-iconv": "*",
    "easycorp/easyadmin-bundle": "^2.3",
    "sensio/framework-extra-bundle": "^5.1",
    "symfony/asset": "5.0.*",
    "symfony/console": "5.0.*",
    "symfony/dotenv": "5.0.*",
    "symfony/expression-language": "5.0.*",
    "symfony/flex": "^1.3.1",
    "symfony/form": "5.0.*",
    "symfony/framework-bundle": "5.0.*",
    "symfony/http-client": "5.0.*",
    "symfony/intl": "5.0.*",
    "symfony/mailer": "5.0.*",
    "symfony/monolog-bundle": "^3.1",
    "symfony/notifier": "5.0.*",
    "symfony/orm-pack": "*",
    "symfony/process": "5.0.*",
    "symfony/security-bundle": "5.0.*",
    "symfony/serializer-pack": "*",
    "symfony/string": "5.0.*",
    "symfony/translation": "5.0.*",
    "symfony/twig-pack": "*",
    "symfony/validator": "5.0.*",
    "symfony/web-link": "5.0.*",
    "symfony/yaml": "5.0.*"
},

У меня есть сущность Project Requirements, которая имеет отношения «многие ко многим» с сущностью User, например:

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="User", inversedBy="projectRequirementsHasUserProjectRequirements")
 * @ORM\JoinTable(name="project_requirements_has_user",
 *   joinColumns={
 *     @ORM\JoinColumn(name="project_requirements_has_user_project_requirements_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="project_requirements_has_user_user_id", referencedColumnName="id")
 *   }
 * )
 */
private $projectRequirementsHasUserUser;

/**
 * Constructor
 */
public function __construct()
{
    $this->projectRequirementsHasUserUser = new \Doctrine\Common\Collections\ArrayCollection();
}

Итак, при добавлении требований я могу назначить пользователя следующим образом:

enter image description here

Вы можете видеть, что первые требования были назначены 2 пользователям:

enter image description here

Теперь я хочу показать все требования, которые были назначены зарегистрированному пользователю.

I узнал, что мне нужно переопределить EasyAdminController по умолчанию, поэтому я настроил свою сущность в config/packages/easy_admin.yaml:

    # Project Planning
    ProjectRequirements:
      controller: App\Controller\ProjectRequirementsController
      class: App\Entity\ProjectRequirements

И затем создал контроллер, но не знаю, как написать фильтр или запрос для выбора только те требования, которые предъявлены зарегистрированному пользователю:

<?php
namespace App\Controller;

use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;

class ProjectRequirementsController extends EasyAdminController {

protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
{

    /** @var QueryBuilder $result  */
    $result = parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter);




    return $result;

}

}

Любая помощь очень приветствуется.

Ответы [ 3 ]

0 голосов
/ 31 мая 2020

После долгих поисков около 2 дней, наконец, я понял, как работает EasyAdmin и Symfony QueryBuilder. Приятно было самому найти решение. Вот что я придумал для решения:

# App\Controller\ProjectRequirementsController.php

protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
{
    /** @var QueryBuilder $result  */
    $result = parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter);

    # Getting data User wise
    $result->leftJoin('entity.projectRequirementsHasUserUser', 'user')
    ->andWhere('user.id = :user')
    ->setParameter('user', $this->getUser());

    return $result;

}

Надеюсь, это поможет кому-то в будущем.

0 голосов
/ 06 июня 2020

Чтобы отобразить данные, указанные пользователем c в списке, вам необходимо добавить аргумент в $ dqfilter.

// Creates the Doctrine query builder used to get all the items. 
// This will override the original methode.
protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
{

    //If the parametter is equal to null, we set the paramtetter to user id
     if (null === $dqlFilter) {
         $dqlFilter = sprintf('entity.author = %s', $this->getUser()->getId());
     } else {
     // If the parametter is not null, we add a new parametter (user id) to the $dqfilter
         $dqlFilter .= sprintf(' AND entity.author = %s', $this->getUser()->getId());
     }

    return parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter);

}

// Creates the Doctrine query builder used to look for items according to the
// user's query. Override this methode if you would not like that user can see other data after doing search query
protected function createSearchQueryBuilder($entityClass, $searchQuery, array $searchableFields, $sortField = null, $sortDirection = null, $dqlFilter = null)
{
   if (null === $dqlFilter) {
        $dqlFilter = sprintf('entity.author = %s', $this->getUser()->getId());
   } else {
        $dqlFilter .= sprintf(' AND entity.author = %s', $this->getUser()->getId());
   }
   return parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter);

}
0 голосов
/ 29 мая 2020

Похоже, вы создали однонаправленное соединение ManyToMany. Попробуйте использовать двунаправленное сопоставление, как описано в документации .

Тогда вы должны легко получить доступ к назначениям вошедшего в систему пользователя через коллекцию массивов в сущности пользователя.

...