与 Shopware 6 中的其他字段的多对多关联

Posted

技术标签:

【中文标题】与 Shopware 6 中的其他字段的多对多关联【英文标题】:Many To Many associations with additional fields in Shopware 6 【发布时间】:2022-01-02 00:58:52 【问题描述】:

我的数据库模型如下所示:

一个用户可以管理多个公司(USER n:n COMPANY),假设他们在中间表 USER_COMPANY 中连接,并且该表有一个额外的字段“活动”。

我已经为两个表创建了 EntityDefinitions 以及为中间表创建了 MappingDefinition:

公司:

class CompanyDefinition extends EntityDefinition

    ...

    protected function defineFields(): FieldCollection
    
        return new FieldCollection([
            (new IdField('id', 'id'))->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'))->addFlags(new PrimaryKey(), new Required()),
            ...

            new ManyToManyAssociationField(
                'companies',
                CompanyDefinition::class,
                CompanyUserDefinition::class,
                'user_id',
                'company_id'
            ),
        ]);
    


COMPANY_USER:

class CompanyUserDefinition extends EntityDefinition


    ...

    protected function defineFields(): FieldCollection
    
        return new FieldCollection([
            (new FkField('company_id', 'companyId', CompanyDefinition::class))->addFlags(new PrimaryKey(), new Required()),
            (new FkField('user_id', 'userId', UserDefinition::class))->addFlags(new PrimaryKey(), new Required()),
            (new BoolField('active', 'active'))->addFlags(new Required()),

            new ManyToOneAssociationField('user', 'user_id', UserDefinition::class, 'id'),
            new ManyToOneAssociationField('company', 'company_id', CompanyDefinition::class, 'id'),
        ]);
    


现在我想使用 CompanyRepository 进行过滤。我只想检索连接到登录用户的公司(我知道他们的 ID),而连接需要处于活动状态。有什么办法可以做到这一点?这不起作用:

$criteria = new Criteria();
$criteria->addAssociation('users');
$criteria->addFilter(new EqualsFilter('users.active', 1));

$companies = $this->companyRepository->search($criteria, $context);

它显示了这个错误:

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

【问题讨论】:

【参考方案1】:

根据您发布的内容,您的 CompanyUserDefinition 有一个“活动”字段,但您的“UserDefinition”可能没有。

【讨论】:

以上是关于与 Shopware 6 中的其他字段的多对多关联的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Doctrine 2 创建与额外字段的多对多自引用关联?

关于symfony的多对多关联关系的字段更新

如何删除与隐藏交集表的多对多关联中的记录?

CASCADE 究竟如何与 Django 中的多对多字段一起工作

与关联对象在同一张表上的多对多关系

SQLAlchemy 使用关联配置与自我的多对多关系