programing

원칙 2 및 추가 필드가 있는 다대다 링크 테이블

newsource 2022. 11. 27. 21:18

원칙 2 및 추가 필드가 있는 다대다 링크 테이블

(당연하지 않은 질문 죄송합니다.이 투고를 쓰면서 몇 가지 질문에 답하려고 했습니다만, 여기 있습니다.

링크 테이블 내에 다대다 관계가 있는 데이터베이스 모델을 작성하려고 합니다만, 링크당 값(이 경우 재고 관리 테이블)도 있습니다.(이것은, 다른 문제에 대한 기본적인 예입니다만, 속행하기 전에 이것만으로 테스트해 보겠습니다).

기본 멀티 스토어, 멀티 제품 스토어 키핑 시스템을 위한 데이터베이스 모델

exportmwb를 사용하여 이 간단한 예제를 위해 두 개의 엔티티 스토어와 제품을 생성했습니다.둘 다 아래에 표시되어 있습니다.

그러나 현재 문제는 Stock.mount value(부정수이므로 서명된 int)에 접근하는 방법을 알 수 없다는 것입니다.또한 교리의 orm:schema-tool:create 함수를 사용하여 테이블을 작성하려고 할 때

HeidiSQ에서 보이는 데이터베이스 레이아웃

다대다 관계는 엔티티가 아니기 때문에 제품과 스토어만 엔티티로 사용할 수 있기 때문에 엔티티로 사용할 수 있는 것은 2개의 엔티티와 3개의 테이블(값이 없는 링크 테이블과 데이터 테이블)뿐이었습니다.

그래서 논리적으로 저장 및 제품과의 관계가 있는 별도 테이블로 재고를 갖도록 데이터베이스 모델을 변경하려고 했습니다.또, 문제의 원인이 되는 것을 제외하기 위해서, 필드명을 고쳐 썼습니다.

변경된 데이터베이스 레이아웃

그러다가 알게 된 건 아직 주식회사를 얻지 못했다는 거야데이터베이스 자체에는 '금액' 필드가 없습니다.

이 가게와 상품을 재고 테이블로 묶을 수 있어야 했습니다.그래서 재고를 추가하는 것 자체는 선택사항이 아닙니다.

root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK]   Entity\Product
[OK]   Entity\Store

데이터베이스를 생성해도 여전히 스톡 테이블의 올바른 필드가 표시되지 않습니다.

HeidiSQ에서 보이는 데이터베이스 레이아웃

여기서 몇 가지를 찾아보니 다대다 접속은 엔티티가 아니기 때문에 가치를 가질 수 없다는 것을 알 수 있었습니다.그래서 다른 사람들과의 관계가 있는 다른 테이블로 바꾸려고 했지만, 여전히 효과가 없었습니다.

내가 여기서 뭘 잘못하고 있는 거지?

추가 값을 가진 다대다 어소시에이션은 다대다(Multi-to-Many)가 아니라 식별자(접속된 엔티티에 대한2개의 관계)와 값이 있기 때문에 실제로는 새로운 엔티티입니다.

이것이 다대다 어소시에이션이 드문 이유이기도 합니다.다대다 어소시에이션에 다음과 같은 추가 속성을 저장하는 경향이 있습니다.sorting,amount,기타.

필요한 것은 다음과 같습니다(양쪽의 관계를 쌍방향으로 하고, 적어도 한쪽은 단방향으로 하는 것을 검토해 주세요.

제품:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="product") @ORM\Entity() */
class Product
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */
    protected $stockProducts;
}

스토어:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="store") @ORM\Entity() */
class Store
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */
    protected $stockProducts;
}

재고:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="stock") @ORM\Entity() */
class Stock
{
    /** ORM\Column(type="integer") */
    protected $amount;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) 
     */
    protected $store;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) 
     */
    protected $product;
}

교리는 다대다 관계를 잘 처리한다.

문제는 단순한 ManyToMany 연결이 필요하지 않다는 것입니다. 연결에는 "추가" 데이터가 있을 수 없기 때문입니다.

중간(주식) 테이블에는 product_id 및 store_id 이상의 데이터가 포함되어 있으므로 추가 데이터를 모델링하기 위한 자체 엔티티가 필요합니다.

즉, 다음 세 가지 유형의 엔티티가 필요합니다.

  • 제품.
  • 재고 수준
  • 가게

및 2개의 어소시에이션:

  • 제품 일대다 재고 수준
  • 일대다 재고 수준 저장

언급URL : https://stackoverflow.com/questions/15616157/doctrine-2-and-many-to-many-link-table-with-an-extra-field