こんにちはこんばんはシステムエンジニアやってますcubeです。

弊社のアプリケーションは大体symfony1.4のpropelで作られていまして、実稼働しているアプリケーションでの管理画面もsymfony1.4のpropelで作りました。
symfonyではadmin-generateと呼ばれる管理画面が以下のタスク実行で簡単に作られるのでとてもお手軽ですね。

ymfonyの公式ページなんかが詳しく解説されていますね
第14章 – Admin ジェネレーター

そして今回は

の解消法。

これはsymfonyのアプリケーションからauto-increment指定されているprimary keyを指定して登録しようとした時に出力されるPropelExceptionでのエラー。
symfonyというよりもpropelのエラーですね。 このエラーをgoogle検索した時に出てくる記事は、弊社システムエンジニアkazさんの以下の記事
symfonyではまったDBのID変更~備忘録~

ほうほう、こんな感じで解消できるのねーと理解はしたものの、数十テーブル一つ一つに書いて行くのはちょっとキツいかもかも.. オーバーライドするのも面倒なので、勝手にbuildしないようにする方法は無いのかな? という面倒臭い精神でbuildするタスクを読んで見る事に。 まずbuildしてるのどこなのーってことでgrep。

sfPropelPlugin/test下のファイル群はbuild後に作成されたものだろうと推測可能なので問題のbuildされている部分は

だと特定できます。('.".$this->getColumnConstant($col).".')と動的に作成されているのでまず間違いないでしょう。

php5peerbuilder.php

っと、対象の生成部分のコードがこれですね。 if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none" && !$table->isAllowPkInsert()) { の部分がありますね。このif文に入らないように、falseになるように値を設定してやれば良さそうです。 名前的に$table->isAllowPkInsert()ってのが怪しいですね。 なのでまたgrep

宣言している場所はここですね lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php:892: public function isAllowPkInsert()

Table.php

のメソッドがそうですね。コメントの内容的にここにtrueを入れれば目的の「primary keyを指定して登録」が出来るようになるなー $this->allowPkInsertをセットしてるとこを探しましょう

Table.php

同じファイル内のsetupObjectで入れているようですね$this->getAttribute("allowPkInsert");trueに入れれば良い事が解ります。 このgetしているattributeはどこじゃーいとなると、またコメントを見てみると * @see parent::loadFromXML()の記述が。 XMLを読み込みだったり一緒にnameだったりphpNameだったりidMethodなりを取得してるーってことでとりあえず当たりが付いたので探索は終了。 XMLを使ったりphpNameだったりの記述があるところはconfig/schema.ymlの中って事が解りました。 試しに変更してみます

対象の箇所が無事削除されました。 これでおーしまい! の人もいるとは思うのですが、いやいやまだまだ。 弊社の環境ではschema.ymlの直変更はしていなく、build用のデータベースを作成してschema.ymlを自動生成しています。 以下のタスクですね。

なのでー、書き換えちゃうと次回のschema.yml作成の時に戻ってしまうんですね。 どうしよー yml作成のタスクでそんなオプション無いか?と思い探してみた物の、無いようですね.. しょうがないので今までのタスクをコピーしてsncPropel:build-schemaを作成、タスクが動くようにclass名を変えたり読み込んでるbaseファイルのパス変えるぐらい。 そして、以下の箇所を

こういう風に変更してしまえば

タスク実行でもschema.ymlは書き変わったものになりますね!

あわせて読みたい記事