91

(一貫性のない質問をしてすみません:この投稿を書いているときにいくつかの質問に答えようとしましたが、ここにあります:)

リンクテーブル内に多対多の関係を持つデータベースモデルを作成しようとしていますが、リンクごとの値(この場合は在庫管理テーブル)もあります。(これは私が抱えているより多くの問題の基本的な例ですが、続行する前にこれでテストしたいと思いました)。

基本的な複数店舗、複数商品の店舗保管システムのデータベースモデル

この簡単な例では、 exportmwbを使用して2つのエンティティストアと製品を生成しました。どちらも以下に表示されています。

ただし、現在の問題は、Doctrineを使用してstock.amount値(負の値になる可能性があるため、signed int)にアクセスする方法がわからないことです。また、doctrineのorm:schema-tool:create関数を使用してテーブルを作成しようとすると

HeidiSQLから見たデータベースレイアウト

これにより、2つのエンティティと3つのテーブルのみが生成されました。1つは値のないリンクテーブルであり、2つのデータテーブルです。多対多の関係はエンティティ自体ではないため、エンティティとしてはProductとStoreしか持てません。

そこで、論理的には、データベースモデルを変更して、店舗と商品の関係を持つ個別のテーブルとして在庫を設定しようとしました。また、問題の原因としてそれを除外できるように、フィールド名を書き直しました。

データベースレイアウトの変更

それから私が見つけたのは、私はまだストックエンティティを取得していなかったということでした...そしてデータベース自体には「金額」フィールドがありませんでした。

私は本当にこれらの店舗と商品を(とりわけ)在庫テーブルにまとめることができる必要がありました...したがって、商品自体に在庫を追加することはオプションではありません。

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

また、データベースを作成しても、ストックテーブルに適切なフィールドが表示されません。

HeidiSQLから見たデータベースレイアウト

そこで、ここでいくつか調べてみると、多対多の接続はエンティティではないため、値を持つことができないことがわかりました。そこで、他のテーブルとの関係を持つ別のテーブルに変更しようとしましたが、それでも機能しませんでした。

私はここで何が間違っているのですか?

4

2 に答える 2

150

追加の値との多対多の関連付けは多対多ではありませんが、識別子(接続されたエンティティへの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;
}
于 2013-03-26T06:24:24.657 に答える
17

Doctrineは多対多の関係をうまく処理します。

関連付けには「余分な」データを含めることができないため、単純な多対多の関連付けは必要ないという問題があります。

ミドル(ストック)テーブルにはproduct_idとstore_id以外のものが含まれているため、その追加データをモデル化するために独自のエンティティが必要です。

したがって、実際には3つのクラスのエンティティが必要です。

  • 製品
  • 在庫量

および2つの関連付け:

  • 製品oneToManyStockLevel
  • oneToManyStockLevelを保存します
于 2013-03-26T01:15:13.770 に答える