EasyAdmin 3: membatasi data untuk pengguna yang masuk masih menunjukkan data lain dalam bentuk dropdown

Aug 17 2020

Saya menggunakan Symfony 5.

Saya ingin setiap pengguna yang masuk memiliki ruangnya sendiri di EasyAdmin 3, jadi tidak ada pengguna yang akan melihat catatan pengguna lain. Saya menyimpan pengguna dengan setiap tabel di database.

Untuk tampilan daftar sederhana, saya berhasil membuatnya bekerja menggunakan ekstensi dari AbstractCrudController:

<?php
namespace App\Controller\Admin;

use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;

abstract class CustomCrudController extends AbstractCrudController
{
    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $qb->andWhere('entity.user = :user'); $qb->setParameter('user', $this->getUser()); return $qb;
    }
}

Saya juga menyimpan / memeriksa pengguna melalui file EventSubscriber.

Masalahnya adalah, beberapa formulir memiliki hubungan dengan Entitas lain (seperti AssociationField::new('food')) dan ketika mengisi dropdown mengabaikan fungsi baru saya. Jadi, Anda akan melihat catatan milik pengguna lain.

Bagaimana cara mengganti tarik-turun ini untuk juga hanya menampilkan data milik pengguna saat ini?

Jawaban

1 Oli Aug 17 2020 at 14:24

Saya menemukan solusinya: berikan kueri khusus ke EntityTypebidang yang mendasari Symfony.

AssociationField::new('food')
    ->setRequired(true)
    ->setFormTypeOptions(['query_builder' => function (EntityRepository $em) { return $em->createQueryBuilder('f')
        ->where('f.user = :user')
        ->orderBy('f.title', 'ASC')
        ->setParameter('user', $this->getUser())
        ;
}]),