WebサーバーでSymfonyをいじくり回し、データベース用にdoctrine=を使用してエンティティを作成しました。これらのエンティティの1つに列を追加したかった...次のようなことをする:
php app/console doctrine:modify:entity
今、私はこのコマンドが存在しないことを知っていますが、単に列を追加する方法があります(全体の移行を行わずに)。
追伸私はphpファイルを開いてそこに列をテキストで追加し、スキーマを更新できることを知っていますが、これを一部のクライアントに配布しており、より「コマンドラインのような」アプローチが好きです。
実際、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
エンティティが定義されているPHP/XML/YMLファイルを開き、そこに列を追加する必要があります。次に、コマンドラインを使用して言います
console doctrine:schema:update
これにより、エンティティ定義がデータベースと同期し、データベースが更新されます。
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は(キャッシュから古いもののメタデータを取得する代わりに)すべてのエンティティを再読み取りし、適切な移行を作成しました。
したがって、エンティティを変更するための一連の手順は次のとおりです。
php app/console redis:flushdb
)php app\console doctrine:migrations:diff
)php app\console doctrine:migrations:migrate
)もちろん、あなたのdoctrineメタデータキャッシュはRedisではなく、app/cache内のファイルやその他の何かのようなものかもしれません。キャッシュのクリアについて考えることを忘れないでください。
誰かに役立つかもしれません。
YourBundle/Resources/Config/doctrine/Yourentity.orm.yml内に新しい列を追加する方法を見つけました。
次に、Entityクラス内にgetterおよびsetterメソッドを追加しました。
その後、php app/console doctrine:schema:update --force
コンソールから。それは私のために働いた。
ここでは、エンティティに変更を加えるために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;
}
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=500)
*/
private $title;
わかりました...あなたはあなたの必要に応じて変更を加えました、そしてあなたはもう一歩です。
ステップ2:プロジェクトディレクトリでこのコマンドを実行する
php bin/console doctrine:schema:update --force
さあ、データベースのテーブルを確認してください、完了です!!
リレーションをマッピングするには、リレーションテーブルを手動で更新する必要があると思います。私はこれを見つけました: discussion
繰り返しますが、既存のデータベース全体からエンティティを生成できますが、個別に? :(
それは私のために働いた方法です:
src-->AppBundle-->Entity-->YourClassName.php
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force
Symfonyの既存のエンティティに新しい列を追加。私は同じ問題を抱えています。私が長い間研究した後、最高のソリューションがあります。
Symfony 4の解決策
例:
すでに1つのname列内に作成されたブログエンティティがあり、description列を追加します。とても簡単な入力
php bin/console make:entity Blog
このコマンドを実行した後、新しい列を追加します