web-dev-qa-db-ja.com

Symfonyの既存のエンティティに列を追加します

WebサーバーでSymfonyをいじくり回し、データベース用にdoctrine=を使用してエンティティを作成しました。これらのエンティティの1つに列を追加したかった...次のようなことをする:

php app/console doctrine:modify:entity

今、私はこのコマンドが存在しないことを知っていますが、単に列を追加する方法があります(全体の移行を行わずに)。

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

33
TheScripter777

実際、Doctrineを使用することは、あなたが提案したようなことをするのにまったく意味がありません。

DoctrineはORM(オブジェクトリレーショナルマッピング)ツールです。 PHPコードからデータベースを抽象化し、データベースをDoctrineに委任します。Doctrineはその領域で素晴らしい仕事をします。

顧客/ピアを最新バージョンのモデルで更新し続けるには、Doctrine Migrations( http://symfony.com/doc/current/ bundles/DoctrineMigrationsBundle/index.html )。これは、データベースの更新を管理する方法です。さらに、データベースをアップグレード/ダウングレードするときの処理を完全に制御できます。たとえば、追加する前にデフォルト値を設定できますFK。

クラスに新しいプロパティを追加する手順は次のとおりです。

Symfony 2の場合:

  • 次の方法でクラスを変更します。

    • Acme\MyBundle\Entity\Customerに追加し、必要なプロパティを追加します。

      Acme\MyBundle\Entity\Customer

    • またはdoctrineファイル:

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

  • コンソールコマンドを実行します(クラスに適切なset/getを追加します)

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

  • コンソールコマンドを実行する

    php app/console doctrine:migrations:diff

  • コンソールコマンドを実行します(app/DoctrineMigrationsに新しいファイルを配置します)

    php app/console doctrine:migrations:migrate

新しいバージョンのコードをデプロイする場合、ソースコードを更新し、上記のコマンドを実行するだけです。

Symfony 3:

  • 次の方法でクラスを変更します。

    • Acme\MyBundle\Entity\Customerに追加し、必要なプロパティを追加します。

      Acme\MyBundle\Entity\Customer

    • またはdoctrineファイル:

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

  • コンソールコマンドを実行します(クラスに適切なset/getを追加します)

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

  • コンソールコマンドを実行する(データベースを更新する)

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

72
P. R. Ribeiro

エンティティが定義されているPHP/XML/YMLファイルを開き、そこに列を追加する必要があります。次に、コマンドラインを使用して言います

console doctrine:schema:update

これにより、エンティティ定義がデータベースと同期し、データベースが更新されます。

9
Tom

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

その後、migrations:diffは(キャッシュから古いもののメタデータを取得する代わりに)すべてのエンティティを再読み取りし、適切な移行を作成しました。


したがって、エンティティを変更するための一連の手順は次のとおりです。

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

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

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

4
FlameStorm

YourBundle/Resources/Config/doctrine/Yourentity.orm.yml内に新しい列を追加する方法を見つけました。

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

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

1
Mihir Bhende

SYMFONY3ユーザーの場合...

ここでは、エンティティに変更を加えるために2つの手順を実行する必要がありますステップ1:エンティティファイルを開きます。例:「Acme\MyBundle\Entity\Book」

現在のエンティティには、id、name、titleなどのフィールドがほとんどありません。「image」の新しいフィールドを追加し、「title」フィールドの制約を変更する場合は、ゲッターとセッターで「image」のフィールドを追加します

/**
     * @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;

わかりました...あなたはあなたの必要に応じて変更を加えました、そしてあなたはもう一歩です。

ステップ2:プロジェクトディレクトリでこのコマンドを実行する

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

さあ、データベースのテーブルを確認してください、完了です!!

1
Kunal

リレーションをマッピングするには、リレーションテーブルを手動で更新する必要があると思います。私はこれを見つけました: discussion

繰り返しますが、既存のデータベース全体からエンティティを生成できますが、個別に? :(

0
Mayukh Roy

それは私のために働いた方法です:

  • 既存のクラス内に新しい変数、セッター、およびゲッターを追加します。
    src-->AppBundle-->Entity-->YourClassName.php
  • oRMファイルを更新します。
  src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
  • bashコマンドを実行します。
  php bin/console doctrine:schema:update --force
0
Tech Nomad

Symfonyの既存のエンティティに新しい列を追加。私は同じ問題を抱えています。私が長い間研究した後、最高のソリューションがあります。

Symfony 4の解決策

例:

すでに1つのname列内に作成されたブログエンティティがあり、description列を追加します。とても簡単な入力

php bin/console make:entity Blog

このコマンドを実行した後、新しい列を追加します

0
Sumit patel