4

数分前、Doctrine2 でエラーを見つけました。

エンティティにいくつかのフィールドを追加してから、mysql テーブルを更新し、新しいデータがテーブルに保存されていないことに気付く前に永続化します。

"->getXXX()" の値で var_dump を試みたところ、正しい結果が得られました。

使用されるコードは次のとおりです。

$user->setName($name);
$user->setSurname($surname);

if($country)
   $user->setCountry($country->getId());

//New code 

if($province > 0)
    $user->setProvince($province);

if($town > 0)
    $user->setTown($town);

var_dump($user->getProvince(), $user->getTown()); //Works OK

$em->persist($user); // Only persists values before Province.
$em->flush();

ありがとうございます。


編集済み

私のエンティティに関する情報:

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

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

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

    /**
     * @var string $mail
     *
     * @ORM\Column(name="mail", type="string", length=80, unique=true)
     */
    private $mail;

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

    /**
     * @var $country
     *
     * @ORM\Column(name="country", type="integer")
     */
    private $country;

    /**
     * @var $province
     *
     * @ORM\Column(name="province", type="integer")
     */
    private $province;

    /**
     * @var $town
     *
     * @ORM\Column(name="town", type="integer")
     */
    private $town;
}

国、州、町は、同じ名前のテーブルの ID です。ManytoOne アソシエーションでフィールドの型を変更しようとしましたが、Doctrine2 で生成された SQL でエラーが発生します。キャッシュエラーのようですが、解決できません。

4

2 に答える 2

2

を使用しているときに、Doctrine で同じ問題が発生しましたdoctrine:schema:update。@lifo のように、Apache を再起動する必要がありました。違いは、私は apc を実行していなかったため、Doctrine がモデルの内部キャッシュを行っていると思います。

$ apachectl -M | grep apc
Syntax OK
于 2013-02-08T21:36:48.747 に答える
0

Doctrine の関連付けがどのように機能するかについて、学ぶべきことがたくさんあります。時間をかけてDoctrine マッピングのドキュメントをよく読むことをお勧めします。

User エンティティは、そのような整数を使用すべきではありません。代わりに、それらのManyToOne関係が必要になる場合があります (つまり、各ユーザーは 1 つの国と 1 つの州を持つことができます)。物事をオブジェクトとして考え始め、 IDを渡さないようにする必要があります。

例えば:

/**
 * @ORM\ManyToOne(targetEntity="Country")
 * @ORM\JoinColumn(name="countryId", referencedColumnName="id")
 */
private $country;

/**
 * @ORM\ManyToOne(targetEntity="Province")
 * @ORM\JoinColumn(name="provinceId", referencedColumnName="id")
 */
private $province;

それらのtargetEntityそれぞれの は、エンティティの名前に変更する必要があります。

これらの変更を試みる場合は、必ずapp/console doctrine:schema:updateコマンドを実行してスキーマを自動的に更新してください。

次に、コントローラーでこれを行うことができます:

$country = new Country('US');
$entityManager->persist($country);
$user->setCountry($country);

setCountry()注: 国 ID をメソッドに割り当てませんでした。実際のCountryオブジェクトを渡します。これは単なる例であり、実際のコントローラーでは、$countryここの変数はフォーム経由で渡されるか、データベースから取得されます。

于 2012-12-12T19:21:53.330 に答える