42

私は自分のWebサーバーでSymfonyをいじっており、データベースのドクトリンを使用してエンティティを作成しています。これらのエンティティの1つに列を追加したかった...次のようなことをしたかった:

php app/console doctrine:modify:entity

これで、このコマンドが存在しないことがわかりましたが、(移行全体を実行せずに)単に列を追加する方法はあります。

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

4

9 に答える 9

83

実際、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

    • または教義ファイルを変更します:

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

  • consoleコマンドを実行します(クラスに適切な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

    • または教義ファイルを変更します:

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

  • consoleコマンドを実行します(クラスに適切なset / getが追加されます)

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

  • consoleコマンドを実行します(データベースの更新)

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

于 2013-02-18T17:44:52.393 に答える
12

Symfonyの既存のエンティティに新しい列を追加します。私は同じ問題を抱えています。私が長い間研究した後、最良の解決策があります。

Symfony4でのソリューション作業

例:

1つの名前列内にすでに作成されているブログエンティティがあり、説明列を追加したいと思います。とても簡単に入力してください

php bin/console make:entity Blog

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

于 2019-08-05T09:30:17.867 に答える
10

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

console doctrine:schema:update

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

于 2013-02-19T00:10:12.493 に答える
4

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内のファイルなどの他の何かである可能性があります。キャッシュのクリアについて考えることを忘れないでください。

それは誰かのために役立つかもしれません。

于 2016-05-12T10:32:40.667 に答える
2

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

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

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

于 2015-09-23T13:51:11.290 に答える
1

SYMFONY3ユーザー向け...

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

現在のエンティティには、id、name、titleなどのフィールドがいくつかあります。「image」の新しいフィールドを追加し、「title」フィールドの制約を変更する場合は、getterとsetterを使用して「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

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

于 2016-12-13T10:17:44.563 に答える
1

f make:entityを使用できるexistinエンティティに新しいフィールドプロパティを追加する必要があります

$ php bin / console make:entity

作成または更新するエンティティのクラス名

「実在」

新しいプロパティ名(押すとフィールドの追加が停止します):

説明

フィールドタイプ(すべてのタイプを表示するには?を入力)[文字列]:

文章

データベースでこのフィールドをnullにすることはできますか(null可能)(yes / no)[no]:

いいえ

新しいプロパティ名(押すとフィールドの追加が停止します):

(もう一度Enterキーを押して終了します)

https://symfony.com/doc/current/doctrine.htmlから抽出された情報

于 2020-10-18T16:31:17.433 に答える
0

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

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

于 2013-02-18T17:17:17.403 に答える
0

それが私にとってどのように機能したかです:

  • 既存のクラス内に新しい変数、セッター、ゲッターを追加します。
    src-->AppBundle-->Entity-->YourClassName.php
  • ORMファイルを更新します。
  src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
  • bashコマンドを実行します。
  php bin/console doctrine:schema:update --force
于 2017-12-15T15:09:57.800 に答える