Mon modèle de base de données ressemble à ceci:
Un utilisateur peut gérer plusieurs entreprises (UTILISATEUR n:n ENTREPRISE), disons qu'ils sont connectés dans la table intermédiaire UTILISATEUR_ENTREPRISE et cette table a un champ supplémentaire 'actif'.
J'ai créé des EntityDefinitions pour les deux tables ainsi que la MappingDefinition pour la table intermédiaire:
ENTREPRISE:
class CompanyDefinition extends EntityDefinition
{
...
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
...
new ManyToManyAssociationField(
'utilisateurs',
UserDefinition::class,
CompanyUserDefinition::class,
'id_entreprise',
'id_utilisateur'
),
]);
}
}
UTILISATEUR:
class UserDefinition extends EntityDefinition
{
....
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
...
new ManyToManyAssociationField(
'entreprises',
CompanyDefinition::class,
CompanyUserDefinition::class,
'id_utilisateur',
'id_entreprise'
),
]);
}
}
UTILISATEUR_ENTREPRISE:
class CompanyUserDefinition extends EntityDefinition
{
...
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new FkField('id_entreprise', 'idEntreprise', CompanyDefinition::class))->addFlags(new PrimaryKey(), new Required()),
(new FkField('id_utilisateur', 'idUtilisateur', UserDefinition::class))->addFlags(new PrimaryKey(), new Required()),
(new BoolField('actif', 'actif'))->addFlags(new Required()),
new ManyToOneAssociationField('utilisateur', 'id_utilisateur', UserDefinition::class, 'id'),
new ManyToOneAssociationField('entreprise', 'id_entreprise', CompanyDefinition::class, 'id'),
]);
}
}
Maintenant, je voudrais faire le filtrage en utilisant CompanyRepository. Je voudrais récupérer uniquement les entreprises qui sont connectées à l'utilisateur connecté (je connais leur ID) tandis que la connexion doit être active. Y a-t-il un moyen de le faire? Cela ne fonctionne pas:
$criteria = new Criteria();
$criteria->addAssociation('users');
$criteria->addFilter(new EqualsFilter('users.actif', 1));
$entreprises = $this->companyRepository->search($criteria, $context);
Cela affiche cette erreur:
"class": "Shopware\\Core\\Framework\\DataAbstractionLayer\\Dbal\\Exception\\UnmappedFieldException",
"message": "Champ \"actif\" dans l'entité \"utilisateur\" non trouvé.",