Много — много ассоциаций с дополнительными полями в Shopware 6

#php #shopware #shopware6

Вопрос:

Моя модель базы данных выглядит следующим образом:

Один пользователь может управлять несколькими компаниями (ПОЛЬЗОВАТЕЛЬ n:КОМПАНИЯ n), допустим, они подключены в промежуточной таблице USER_COMPANY, и в этой таблице есть одно дополнительное поле «активный».

Я создал определения сущностей для обеих таблиц плюс определение отображения для промежуточной таблицы:

Компания:

 class CompanyDefinition extends EntityDefinition {  ...   protected function defineFields(): FieldCollection  {  return new FieldCollection([  (new IdField('id', 'id'))-gt;addFlags(new PrimaryKey(), new Required()),   ...   new ManyToManyAssociationField(  'users',  UserDefinition::class,  CompanyUserDefinition::class,  'company_id',  'user_id'  ),  ]);  } }  

пользователь:

 class UserDefinition extends EntityDefinition {  ....   protected function defineFields(): FieldCollection  {  return new FieldCollection([  (new IdField('id', 'id'))-gt;addFlags(new PrimaryKey(), new Required()),  ...   new ManyToManyAssociationField(  'companies',  CompanyDefinition::class,  CompanyUserDefinition::class,  'user_id',  'company_id'  ),  ]);  }  }  

ПОЛЬЗОВАТЕЛЬ КОМПАНИИ:

 class CompanyUserDefinition extends EntityDefinition {   ...   protected function defineFields(): FieldCollection  {  return new FieldCollection([  (new FkField('company_id', 'companyId', CompanyDefinition::class))-gt;addFlags(new PrimaryKey(), new Required()),  (new FkField('user_id', 'userId', UserDefinition::class))-gt;addFlags(new PrimaryKey(), new Required()),  (new BoolField('active', 'active'))-gt;addFlags(new Required()),   new ManyToOneAssociationField('user', 'user_id', UserDefinition::class, 'id'),  new ManyToOneAssociationField('company', 'company_id', CompanyDefinition::class, 'id'),  ]);  }  }  

Теперь я хотел бы выполнить фильтрацию с помощью каталога компании. Я хотел бы получить только компании, которые подключены к зарегистрированному пользователю (я знаю их идентификатор), в то время как соединение должно быть активным. Есть ли какой-нибудь способ, как это сделать? Это не работает:

 $criteria = new Criteria(); $criteria-gt;addAssociation('users'); $criteria-gt;addFilter(new EqualsFilter('users.active', 1));  $companies = $this-gt;companyRepository-gt;search($criteria, $context);  

Это показывает эту ошибку:

 "class": "Shopware\Core\Framework\DataAbstractionLayer\Dbal\Exception\UnmappedFieldException", "message": "Field "active" in entity "user" was not found.",    

Ответ №1:

Из того, что вы опубликовали, следует, что в определении пользователя вашей компании есть поле «активный», но ваше «Определение пользователя» может отсутствовать.