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

k97glaaz  于 2023-03-11  发布在  PHP
关注(0)|答案(2)|浏览(109)

我的数据库模型如下所示:
一个用户可以管理多个公司(USER n:n COMPANY),假设它们在中间表USER_COMPANY中连接,并且该表有一个附加字段“active”。
我已经为两个表创建了EntityDefinition,并为中间表创建了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'
            ),
        ]);
    }

}

公司用户:

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

xj3cbfub1#

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

tuwxkamq

tuwxkamq2#

我做了一个变通方案,首先创建具有多对多关系的实体,然后使用Map定义实体的存储库来更新具有所需额外值的行。另一个解决方案是用一对多和多对一关系替换多对多关系,并将“中间”表视为一个单独的实体。

相关问题