예를 통한 Shopware 데이터 연결

데이터베이스 테이블은 종종 서로 관련되어 있습니다. 예를 들어 블로그 게시물에 댓글이 많거나 주문한 사용자와 관련된 주문이 있을 수 있습니다.

이 블로그 게시물에서는 엔터티에 연결을 추가하는 방법에 대한 간단한 예를 설명합니다.

1-1



일대일 연결은 매우 기본적인 데이터베이스 연결 유형입니다. 예를 들어 User 테이블은 하나의 Media 테이블과 연결될 수 있습니다. 이 연결을 정의하기 위해 OneToOneAssociationFieldUserDefinitionMediaDefinition 를 배치합니다.



두 엔터티 정의의 defineFields 메서드를 살펴보겠습니다.

// class UserDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new FkField('avatar_id', 'avatarId', MediaDefinition::class)),
        (new OneToOneAssociationField('avatarMedia', 'avatar_id', 'id', MediaDefinition::class)),
    ]);
}



// class MediaDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new OneToOneAssociationField('avatarUser', 'id', 'avatar_id', UserDefinition::class, false))->addFlags(new CascadeDelete()),
    ]);
}


일대다



일대다 연관은 단일 테이블이 하나 이상의 하위 테이블에 대한 상위인 연관을 정의하는 데 사용됩니다. 예를 들어, ProductPrice의 무한 수를 가질 수 있습니다.



이제 다음 예를 살펴보겠습니다.

// class ProductDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new OneToManyAssociationField('prices', ProductPriceDefinition::class, 'product_id'))->addFlags(new CascadeDelete(), new Inherited()),
    ]);
}



// class PriceDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new Required()),
        (new ManyToOneAssociationField('product', 'product_id', ProductDefinition::class, 'id', false))->addFlags(new ReverseInherited('prices')),
    ]);
}


다대다



Shopware는 다대다 연결 작업을 보다 편리하게 수행할 수 있는 방법도 제공합니다. 예를 들어, ProductCategory를 많이 가질 수 있고 CategoryProduct를 많이 가질 수 있다고 상상해 봅시다.

이 연결을 사용하려면 세 번째 엔터티를 사용할 수 있어야 합니다. ProductCategoryDefinition라고 하며 두 정의를 연결하는 역할을 합니다. 자체 데이터베이스 테이블도 필요합니다product_category.



// class ProductDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new VersionField())->addFlags(new ApiAware()),
        (new ManyToManyAssociationField('categories', CategoryDefinition::class, ProductCategoryDefinition::class, 'product_id', 'category_id'))->addFlags(new ApiAware(), new CascadeDelete(), new Inherited(), new SearchRanking(SearchRanking::ASSOCIATION_SEARCH_RANKING)),
    ]);
}



// class CategoryDefinition extends EntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new VersionField())->addFlags(new ApiAware()),
        (new ManyToManyAssociationField('products', ProductDefinition::class, ProductCategoryDefinition::class, 'category_id', 'product_id'))->addFlags(new CascadeDelete(), new ReverseInherited('categories')),
    ]);
}



// class ProductCategoryDefinition extends MappingEntityDefinition
protected function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new PrimaryKey(), new Required()),
        (new ReferenceVersionField(ProductDefinition::class))->addFlags(new PrimaryKey(), new Required()),

        (new FkField('category_id', 'categoryId', CategoryDefinition::class))->addFlags(new PrimaryKey(), new Required()),
        (new ReferenceVersionField(CategoryDefinition::class))->addFlags(new PrimaryKey(), new Required()),

        (new ManyToOneAssociationField('product', 'product_id', ProductDefinition::class, 'id', false)),
        (new ManyToOneAssociationField('category', 'category_id', CategoryDefinition::class, 'id', false)),
    ]);
}



이 기사에 대한 피드백을 받게 되어 정말 기쁩니다. 소중한 시간을 내어 읽어주셔서 감사합니다.

출처: https://viennt.me/shopware-data-associations-by-examples

좋은 웹페이지 즐겨찾기