2

データベースとDoctrineの使用に関するSymfony2の本( http://symfony.com/doc/2.0/book/doctrine.html )に書かれているコードを読んでフォローしています。「Entity Relationships/Associations」セクションに到達しましたが、フレームワークが意図したとおりに動作していないようです。保護された $category フィールドを Product エンティティに追加し、$products フィールドを Category エンティティに追加しました。私の製品とカテゴリのエンティティは次のとおりです。

製品:

<?php

namespace mydomain\mywebsiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=255)
     */
    private $description;

    /*
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;

    /**
     * Set description
     *
     * @param string $description
     * @return Product
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
}

カテゴリー:

<?php

namespace mydomain\mywebsiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use \Doctrine\Common\Collections\ArrayCollection;

/**
 * Category
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=255)
     */
    private $description;

    /*
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    protected $products;

    public function __construct(){
        $this->products = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Category
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

ドキュメントによると、今実行すると

$ php app/console doctrine:generate:entities mydomain

フレームワークは、Product の新しいカテゴリ フィールドと、Category の新しい製品フィールドのゲッター/セッターを生成する必要があります。

ただし、コマンドを実行すると、エンティティが更新されると思われますが、プロパティは追加されません。バックアップ (~) ファイルと比較しましたが、違いはありません。別のフィールド (例: description2) を追加し、永続化のためのドクトリン アノテーションを追加すると、プロパティが生成されます。最初はこれを無視し、マッピング フィールドのプロパティを手動で追加してから実行しました。

$php app/console doctrine:schema:update --force

新しい関連付け列を追加します。

ただし、メタデータとスキーマが最新であることがもう一度わかりました。

app/cache/dev フォルダーを削除し、システムがそれを再作成できるようにしましたが、違いはありません。

ドキュメントに記載されているようにフレームワークが動作しない理由を誰でも見ることができますか??

ありがとう

4

5 に答える 5

4

ここで星を 1 つ忘れました:

/*
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

それは違いない

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;
于 2013-01-17T09:32:31.320 に答える
1

私が見つけた問題に基づいて、2種類の定義を持つことができないという問題があります..本では、カテゴリのエンティティ作成コマンドもyml構成を作成するため、注釈が失敗しました。注釈、yml、xml、または php のいずれかを使用する必要があります。yml構成を削除し、それが機能する注釈を付けてテーブルを再作成したら..注意して、カテゴリの作成にcomnadを使用しないでください..それでも、説明が必須フィールドであるというエラーが表示されます:)

于 2014-04-21T09:44:04.870 に答える
1

更新:さまざまなことを試してもまったく成功しなかった後、バンドル全体と関連するデータベースを削除し、最初からやり直すことになりました。2 回目は正しく生成され、データベース スキーマが正しく更新されています。このような不安定な動作は、フレームワークの非常に貧弱であり、上記のコメントで述べたように、開発者として Grails から離れようとしている理由です。今、symfony2 にも同じ種類の問題があることがわかりました。

フレームワークを使用するとき、フレームワークにバグがあるために何かが機能していないかどうかを常に頭に入れておく必要はありません。これは、このような主流のフレームワークではまったく受け入れられません。このような問題に遭遇したのは私だけではないようです。フレームワークの開発者は、(できれば) 解決するか、フレームワークがランダムに失敗する理由を理解する手段を提供することで、このような問題に確実に対処する必要があります。

于 2012-12-30T15:27:21.540 に答える
0

getter と setter の生成に関しては、Symfony は単に ReflectionClass を使用して、メソッドが既に存在するかどうかを調べています。注釈にどのようなプロパティが書かれているかはわかりません。

スキーマの更新の問題に関しては、データベースをリセットして最初から作成するという別の解決策はありません。私はこの問題に数回直面しましたが、実際には良い解決策が見つかりませんでした.Symfony はいくつかのプロパティ間で違いがないようで、更新が見つかりません.

私は今、それを調べるためのフレームワークを手で持っていません。おそらく、 schema:update が正確に何をしているのかを調べて、エラーを見つけることができます。

于 2012-12-30T14:17:21.890 に答える