2 votes

Les associations Many to Many avec des champs supplémentaires dans Shopware 6

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é.",

0voto

Zsolt Szilagy Points 1636

D'après ce que vous avez posté, votre CompanyUserDefinition a un champ "actif", mais votre UserDefinition pourrait ne pas en avoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X