Merge branch 'menuitem_aliases'
This commit is contained in:
commit
e3157c1c50
1 changed files with 35 additions and 12 deletions
|
@ -12,26 +12,49 @@ use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
use function assert;
|
||||||
|
|
||||||
final class MenuItemType extends AbstractType
|
final class MenuItemType extends AbstractType
|
||||||
{
|
{
|
||||||
#[Override]
|
#[Override]
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
{
|
{
|
||||||
$vendor = $options['data']->getFoodVendor();
|
$item = $options['data'];
|
||||||
$vendorId = $vendor->getId();
|
assert($item instanceof MenuItem); // Ensure it's of the correct type
|
||||||
$builder
|
$vendorId = $item->getFoodVendor()?->getId(); // Use safe navigation operator in case FoodVendor is null
|
||||||
->add('name')
|
|
||||||
->add('aliasOf', EntityType::class, [
|
$builder->add('name'); // Basic field
|
||||||
'class' => MenuItem::class,
|
$builder->add('aliases', EntityType::class, [
|
||||||
'choice_label' => 'name',
|
'class' => MenuItem::class,
|
||||||
'query_builder' => static fn(MenuItemRepository $repository): QueryBuilder => $repository
|
'choice_label' => 'name',
|
||||||
->createQueryBuilder('m')
|
'multiple' => true,
|
||||||
|
'expanded' => true,
|
||||||
|
'query_builder' => static function (MenuItemRepository $repository) use ($item, $vendorId): QueryBuilder {
|
||||||
|
$qb = $repository->createQueryBuilder('m');
|
||||||
|
|
||||||
|
// Build the main query with a NOT EXISTS constraint
|
||||||
|
$qb
|
||||||
->where('m.foodVendor = :vendorId')
|
->where('m.foodVendor = :vendorId')
|
||||||
->andWhere('m.deletedAt IS NULL')
|
->andWhere('m.deletedAt IS NULL')
|
||||||
|
->andWhere('m.id != :id')
|
||||||
|
->andWhere(
|
||||||
|
$qb->expr()
|
||||||
|
->notIn(
|
||||||
|
'm.id',
|
||||||
|
$repository->createQueryBuilder('m2')
|
||||||
|
->select('m2.id')
|
||||||
|
->where('m2.aliasOf != m.id') // Reference m.id in the inner query
|
||||||
|
->orWhere('m2.aliasOf IS NOT NULL')
|
||||||
|
->getDQL() // The subquery's DQL string
|
||||||
|
)
|
||||||
|
)
|
||||||
->orderBy('m.name', 'ASC')
|
->orderBy('m.name', 'ASC')
|
||||||
->setParameter(':vendorId', $vendorId, UlidType::NAME),
|
->setParameter('vendorId', $vendorId, UlidType::NAME) // ULID or appropriate type
|
||||||
])
|
->setParameter('id', $item->getId(), UlidType::NAME); // ULID or appropriate type
|
||||||
;
|
|
||||||
|
return $qb;
|
||||||
|
},
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Override]
|
#[Override]
|
||||||
|
|
Loading…
Add table
Reference in a new issue