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


88

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

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

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

내가 사용했습니다 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에서 본 데이터베이스 레이아웃

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

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


좋아, 나는 Doctrine을 사용하여 다 대다 연결을 할 수 없다는 언급과 이러한 관계를 방지하기 위해 조언하는 주석을 언급하는 몇 가지 언급을 찾았습니다. 내 원래 질문? 다 대다 관계에 완전히 의존하는 Magento와 호환되는 전체 데이터베이스가 있습니다. 그래서 기본적으로 "Doctrine ORM은 다대 다를 처리 할 수 ​​없습니다. 사용하지 마십시오"라는 말을 들었습니다. ??
Henry van Megen 2013 년


3
내가 노력에 대한 당신은 내가 :-) 그런 좋은 방법에 대해 궁금 정확히 설명하기 위해 만든 수 있다면 당신에게 100를 줄 것이다
스텐 뢰머 (Römer)

답변:


142

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

즉 대다 협회 그렇게 드문 이유도 이유 : 당신 같은 그들에 추가 속성을 저장하는 경향이 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;
}

이 설정으로, 난 단지 기본 키 위 : 모든 값없이 실행 얻을 수 있기 때문에 좋아, 나는 몇 가지 getter와 setter를 추가 할 것입니다
헨리 밴 Megen

이 설정을 사용한 다음 Stock.store_id를 사용하여 쿼리하려고하면 "Stock에 store_id라는 필드 또는 연결이 없습니다"라는 오류가 발생합니다. 컬럼이 데이터베이스에 존재하기 때문에 발견되어야합니다.
afilina 2013-08-06

스키마를 생성하는 동안 @afilina DB를 상관 없다 -은 (메모리)에 DDL 메타 데이터의 열을 찾지 않기 때문에 DBAL 예외를 발생
Ocramius

@Ocramius 내가 의미하는 것은 DB가 메타 데이터에서 생성되었다는 것입니다. 처음에 열을 생성 할 수 있었다면 쿼리 중에 찾을 수 있어야합니다. 내 문제에 대한 해결책은 Stock.store를 원하는 ID와 비교하는 것이 었습니다.
afilina

100 % 내가 필요로하는 것은 매력처럼 작동합니다! 상점 및 제품 당 금액을 편집하기 위해 필드 셋으로 양식을 작성하는 방법을 알고 있습니까?
cwhisperer 2014

17

교리는 다 대다 관계를 잘 처리합니다.

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

중간 (재고) 테이블에는 product_id 및 store_id 이상이 포함되어 있으므로 해당 추가 데이터를 모델링하려면 자체 엔터티가 필요합니다.

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

  • 생성물
  • StockLevel
  • 저장

두 개의 연결 :

  • 제품 oneToMany StockLevel
  • oneToMany StockLevel 저장

1
답변 주셔서 감사합니다 ! 내 "재고"와 같은 테이블에 추가 필드를 추가했습니다. 그러나 교리는 여전히이 "조인 테이블"을 고려하지 않고 php app/console doctrine:mapping:import AppBundle yml데이터베이스에서 스키마를 가져 오기 위해 실행할 때 건너 뜁니다 . 이 추가 매핑 yaml 파일을 생성하고 싶습니다. 누구든지 아이디어가 있습니까? :(
Stphane 2015 년

"연결"엔티티에 데이터 쓰기를 해결하지 않는 것으로 응답하십시오. 이것은 문제입니다. 엔티티를 선언하지 않습니다. 누군가가 Form (CollectionType 필드에 EntityType 필드가 포함 된 양식이 포함되어 있음)에서 데이터가 전달되는 예제를 지원할 수 있습니다. 나는 제대로 기본 폼에 임베디드 형태에서 데이터를 전달하고, 필드의 컬렉션을 저장할 수 없습니다
zoore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.