[php] 추가 필드가있는 교리 2 및 다 대다 링크 테이블

(일관되지 않은 질문에 대해 죄송합니다.이 게시물을 작성하면서 몇 가지 질문에 대답하려고했지만 여기에 있습니다.)

링크 테이블 내부에 다 대다 관계가있는 데이터베이스 모델을 만들려고하지만 링크 당 값 (이 경우에는 재고 유지 테이블)도 있습니다. (이것은 내가 가진 더 많은 문제에 대한 기본적인 예이지만 계속하기 전에 이것으로 테스트 할 것이라고 생각했습니다).

기본 다중 상점, 다중 제품 상점 유지 시스템을위한 데이터베이스 모델

내가 사용했습니다 exportmwb는 이 간단한 예를 들어 두 개의 엔티티 저장 및 제품을 생성하기 위해, 모두 아래에 표시됩니다.

그러나 문제는 Doctrine을 사용하여 stock.amount 값 (음수 일 수 있으므로 int로 표시됨)에 액세스하는 방법을 알아낼 수 없다는 것입니다. 또한 교리의 orm : schema-tool : create 함수를 사용하여 테이블을 만들려고 할 때

HeidiSQL에서 본 데이터베이스 레이아웃

다 대다 관계가 엔터티 자체가 아니기 때문에 엔터티 2 개와 테이블 3 개만 생성되었습니다.

그래서 논리적으로 재고를 매장과 제품에 대한 관계가있는 별도의 테이블로 만들도록 데이터베이스 모델을 변경하려고했습니다. 또한 문제의 원인으로 제외 할 수 있도록 필드 이름을 다시 작성했습니다.

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

그런 다음 내가 찾은 것은 여전히 ​​Stock 엔터티를 얻지 못했고 데이터베이스 자체에는 ‘금액’필드가 없다는 것입니다.

저는 이러한 상점과 제품을 재고 테이블에 묶을 수 있어야했기 때문에 제품 자체에 재고를 추가하는 것은 옵션이 아닙니다.

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

그리고 데이터베이스를 만들 때 여전히 stock 테이블에 올바른 필드를 제공하지 않습니다.

HeidiSQL에서 본 데이터베이스 레이아웃

그래서 여기서 몇 가지를 살펴보면 다 대다 연결은 엔티티가 아니므로 값을 가질 수 없다는 것을 알았습니다. 그래서 다른 사람들과의 관계가있는 별도의 테이블로 변경하려고 시도했지만 여전히 작동하지 않았습니다.

내가 여기서 뭘 잘못하고 있니?



답변

추가 값이있는 다 대다 연관은 다대 다가 아니지만 실제로는 새로운 엔터티입니다. 이제 식별자 (연결된 엔터티에 대한 두 가지 관계)와 값이 있기 때문입니다.

즉 대다 협회 그렇게 드문 이유도 이유 : 당신 같은 그들에 추가 속성을 저장하는 경향이 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 이상이 포함되어 있으므로 해당 추가 데이터를 모델링하려면 자체 엔터티가 필요합니다.

따라서 세 가지 유형의 엔티티가 필요합니다.

  • 생성물
  • StockLevel
  • 저장

두 개의 연결 :

  • 제품 oneToMany StockLevel
  • oneToMany StockLevel 저장


답변