If you are having trouble with dot notation in EasyAdmin filters and cannot wait for Use filters on nested properties #4882, you can use this workaround.
Of course, this code is not optimal and probably does not support all comparison cases, but it can still work as a foundation for your temporary solution.
Tested on EasyAdmin v4.9.4
Entities
For the sake of clarity in the example, all mapping and other methods are omitted.
class Location
{
public string $id;
public string $name;
public function getNiceName(): string
{
return \sprint('#%d - %s', $this->id, $this->name);
}
}
class Offer
{
public string $id;
#[ORM\ManyToOne(targetEntity: Location::class))]
private Location $location
}
class Contract
{
public string $id;
#[ORM\ManyToOne(targetEntity: Offer::class))]
private Location $offer
}
class Invoice
{
public string $id;
#[ORM\ManyToOne(targetEntity: Contract::class))]
private Location $contract
}
Filters
Filter by location, where Location::class
is assosiated with Offer::class
(offer.location)
, and to get Offer::class
we need to have Contract::class
(contract.offer.location)
.
class InvoiceCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Invoice::class;
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(AssociatedEntityFilter::new('contract.offer.location', 'Location')
->setFormTypeOptions([
'value_type_options.class' => Location::class,
'value_type_options.choice_label' => 'getNiceName',
])
);
}
}
Or filter in Contract::class
crud
class ContractCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Contract::class;
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(AssociatedEntityFilter::new('offer.location', 'Location')
->setFormTypeOptions([
'value_type_options.class' => Location::class,
'value_type_options.choice_label' => 'getNiceName',
])
);
}
}
Also works as EntityFilter
class OfferCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Offer::class;
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(AssociatedEntityFilter::new('location', 'Location')
->setFormTypeOptions([
'value_type_options.class' => Location::class,
'value_type_options.choice_label' => 'getNiceName',
])
);
}
}
Thanks for sharing! Is the
FilterQueryTrait
missing in this Gist? I can't seem to find it as part of EasyAdmin.