2013-02-18 19 views
25

私はWebサーバー上でSymfonyを使いこなしています。私は自分のデータベースのためにdoctrineを使ってエンティティを作成しています。全体の移行を行うことなく、今(私は、このコマンドが存在しないことを知っているが、方法があるSymfonyの既存のエンティティにカラムを追加する

php app/console doctrine:modify:entity 

:私は、私のようなものをやってみたかった...これらのエンティティのいずれかに列を追加したいです単に列を追加するだけです)。

P.S.私はPHPファイルを開いてテキストを追加してそこに列を追加してスキーマを更新することができると知っていますが、私はこれをいくつかのクライアントに配布しており、もっと「コマンドラインのような」アプローチが好きです。

+2

--forceコードでそれを行います。 ORMの生成ツールは、そのように悪用すべきではありません。 – Ocramius

答えて

57

、Doctrineはあなたが示唆したような何かをすることは全く意味がありません使用。

DoctrineがORM(オブジェクトリレーショナルマッピング)のツールです。それはあなたから抽象データベースにしたいということを意味しますPHPコードでは、データベースの内容をDoctrineに委譲しますDoctrineはその分野で素晴らしい仕事をしています

最新のバージョンのモデルでお客様や同僚を更新したい場合は、Doctrine Migrations(http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html)データベースの更新を管理する方法です。また、データベースのアップグレード/ダウングレード時に行う処理を完全に制御できます。たとえば、yの前にデフォルト値を設定することができますFKを追加してください。クラスに新しいプロパティを追加するための

手順は次のようになります。

  • はしてクラスを変更します。

    • アクメ\ MyBundle \エンティティ\顧客としたいプロパティを追加します。

      Acme\MyBundle\Entity\Customer

    • や教義のファイルを変更:コンソールコマンドを実行します

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • を(それはクラス内のget /適切なセットを追加します)

    php app/console doctrine:generate:entities AcmeMyBundle:Customer

  • あなたが展開しているとき

    php app/console doctrine:migrations:migrate

(それはアプリ/ DoctrineMigrations上に新しいファイルを配置します)コンソールコマンドを実行します

php app/console doctrine:migrations:diff

  • コンソールコマンドを実行します新しいバージョンのコードは、ソースコードを更新して上記のコマンドを実行するだけです。 symfonyの3のために

    • でクラスを変更:

      • アクメ\ MyBundle \エンティティ\顧客としたいプロパティを追加します。

        Acme\MyBundle\Entity\Customer

      • や教義のファイルを変更:コンソールコマンドを実行します

        Acme/MyBundle/Resources/config/doctrine/customer.yml

    • を(それはクラス内のget /適切なセットを追加します)

      php bin/console doctrine:generate:entities AcmeMyBundle:Customer

    • は(更新データベース)あなたは間違いなくあなたのエンティティが定義されているPHP/XML/YMLファイルを開いて、そこに列を追加しますか

      php bin/console doctrine:schema:update --force

  • +0

    評判の低い男がこれを編集して追加しようとしました。これは参考になるかもしれませんので、ここに書きます: 'php bin/console doctrine:schema:update --force':WARNING [official docs](https://symfony.com/doc/current/doctrine.html#データベーステーブルスキーマの作成)は、これを本番環境で使用しないでください。 – YakovL

    0

    私は、関係をマップするためにあなたの関係テーブルを手動で更新する必要があると思います。 私はこれを見つけました:discussion

    もう一度、全体として、しかし別々に、既存のデータベースからエンティティを生成できますか? :(実際

    7

    コンソールコマンドを実行します。その後、あなたはコマンドラインを使用して

    console doctrine:schema:update 
    

    そのように言って、あなたのエンティティ定義がデータベースと同期していると、データベースが更新されます。

    1

    YourBundle/Resources/Config/doctrine/Yourentity.orm.ymlの中に新しい列を追加した方法が見つかりました。

    次に、Entityクラス内にgetterメソッドとsetterメソッドを追加しました。

    その後コンソールからphp app/console doctrine:schema:update --forceを実行しました。それは私のために働いた。

    2

    doctrineの移行を使用する場合、上記の手順php app/console doctrine:migrations:diffに落とし穴があります。

    エンティティを変更しましたが、すべて有効と思われますが、移行の作成時のコマンドphp app/console doctrine:migrations:diffに「マッピング情報に変更は検出されませんでした」と表示されます。

    どこに古いデータベース構造が置かれているのかわかりません。ファイル内の検索で何も見つかりませんでした。

    私にとって、キーはRedisキャッシュをクリアすることでした。

    php app/console redis:flushdb 
    

    それはその後ためconfig.ymlの

    snc_redis: 
        clients: 
         default: 
          type: predis 
          alias: default 
          dsn: redis://localhost 
        doctrine: 
         query_cache: 
          client: default 
          entity_manager: default 
          namespace: "%kernel.root_dir%" 
         metadata_cache: 
          client: default 
          entity_manager: default 
          document_manager: default 
          namespace: "%kernel.root_dir%" 
         result_cache: 
          client: default 
          namespace: "%kernel.root_dir%" 
          entity_manager: [default, read] # you may specify multiple entity_managers 
    

    を起こり、マイグレーション:diffは(代わりにキャッシュから古くなったもののメタデータを取るの)実体のすべてを再読み込み、右の移行を作成しました。


    ので、変更するエンティティのための手順の完全なチェーンは、次のとおりです。

    1. (エンティティ・クラス(編集エンティティファイル)(php app/console redis:flushdb
    2. が作成したメタデータの
    3. クリアRedisのキャッシュを変更します。編集可能かもしれません)移行(php app\console doctrine:migrations:diff
    4. 移行実行(php app\console doctrine:migrations:migrate

    もちろん、あなたのdoctrineメタデータキャッシュはRedisではなく、app/cacheや他の何かのファイルのようなものかもしれません。キャッシュクリアについて考えるのを忘れないでください。

    誰かに役立つかもしれません。

    SYMFONY3のUSERS FOR
    +0

    うわー、それは予期せぬことでした。特に、 'cache:clear'が問題を解決しなかったのに、redis flushが起きた時です。 – antongorodezkiy

    1

    ...ここ

    あなたのエンティティに変更を加えるための2つの手順に従うことをしている

    ステップ1:あなたのエンティティFile..For EXを開きます。 "アクメ\ MyBundle \エンティティ\帳"

    Current Entityには、ID、名前、タイトルなどのフィールドがほとんどありません。あなたは「イメージ」の新しいフィールドを追加すると「タイトル」フィールドの変更制約を作りたい場合は はさてゲッターとセッター

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

    を「画像」のフィールドを追加し、ゲッターとセッター

    /** 
        * Set image 
        * 
        * @param string $image 
        * 
        * @return Book 
        */ 
        public function setImage($image) 
        { 
         $this->image = $image; 
    
         return $this; 
        } 
    
        /** 
        * Get image 
        * 
        * @return string 
        */ 
        public function getimage() 
        { 
         return $this->image; 
        } 
    
    を追加します

    長さからタイトルの既存のフィールド制約を更新するには255

    500から
    /** 
        * @var string 
        * 
        * @ORM\Column(name="title", type="string", length=500) 
        */ 
        private $title; 
    

    [OK]を...あなたはあなたの必要性に応じて変更を加えた、そして、あなたは一歩離れています。

    ステップ2:消防、このコマンドプロジェクトディレクトリに

    php bin/console doctrine:schema:update --force 
    

    さて、データベース内のテーブルをチェックし、それは完了です!

    0

    それは私のために働いた方法は次のとおりです。

    • は、既存のクラス内に新しいVARS、セッターとゲッターを追加します。

      SRC - > AppBundle - >エンティティ - > YourClassName.php

    • 更新ORMファイル:

      SRC - > AppBundle - >リソース - >設定 - >ドクトリン - > YourClassName.orm.yml

    • 実行bashコマンド:

      PHPビン/コンソール教義:スキーマ:更新

    関連する問題