#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:
Из того, что вы опубликовали, следует, что в определении пользователя вашей компании есть поле «активный», но ваше «Определение пользователя» может отсутствовать.