バージョン選択

フォーラム

メニュー

オンライン状況

92 人のユーザが現在オンラインです。 (80 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 92
もっと...

サイト内検索

質問 > 管理機能 > Doctrineのpersist()時、auto increment対象のIDを指定したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nicketium
投稿日時: 2017/9/29 1:42
対応状況: −−−
新米
登録日: 2016/11/30
居住地: 札幌市
投稿: 10
Doctrineのpersist()時、auto increment対象のIDを指定したい
Eccube3です。

題名の通りですが、
挿入される時のIDを指定したいと思っています。

Entityを使ったpersistでできないかと思っておりますが、
Eccube3のIDにはsetterがないので、
どうやったらID固定ができるかわかりません。

可能な処理があれば教えて頂きたいです。
468
投稿日時: 2017/9/29 11:59
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: Doctrineのpersist()時、auto increment対象のIDを指定したい
doctirneにはIDを指定してセットする機能は無いのではないでしょうか?
IDを固定したい要件がどういったものか想像がつかないのですが、
差し支えなければ、教えていただけないでしょうか?
(他システムとの連携等ですか?)


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

nicketium
投稿日時: 2017/9/30 20:56
対応状況: −−−
新米
登録日: 2016/11/30
居住地: 札幌市
投稿: 10
Re: Doctrineのpersist()時、auto increment対象のIDを指定したい
ご返信ありがとうございます。
案件で、他ECサイトからのDBデータ移行を簡単にできるシステムを作っております。
DBを直接操作しないのは、クライアント様が今後も自身でできるようにが理由です。

更に色々調べましたところ自己解決まで至りましたので、解決法のご報告致します。

・ReflectionProperty
・AssignedGenerator
を使用します。

関数が海外フォーラムにのっておりましたので、記載します。


/**
 * IDを指定して登録する
 */
public function insertEntity(\Doctrine\ORM\EntityManager $em, $entity, $id = null, $columnName = 'id')
{
    $className = get_class($entity);
    if ($id) {
        $idRef = new \ReflectionProperty($className, $columnName);
        $idRef->setAccessible(true);
        $idRef->setValue($entity, $id);

        $metadata = $em->getClassMetadata($className);
        /** @var \Doctrine\ORM\Mapping\ClassMetadataInfo $metadata */
        $generator = $metadata->idGenerator;
        $generatorType = $metadata->generatorType;

        $metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
        $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);

        $unitOfWork = $em->getUnitOfWork();
        $persistersRef = new \ReflectionProperty($unitOfWork, "persisters");
        $persistersRef->setAccessible(true);
        $persisters = $persistersRef->getValue($unitOfWork);
        unset($persisters[$className]);
        $persistersRef->setValue($unitOfWork, $persisters);

        $em->persist($entity);
        $em->flush();

        $idRef->setAccessible(false);
        $metadata->setIdGenerator($generator);
        $metadata->setIdGeneratorType($generatorType);

        $persisters = $persistersRef->getValue($unitOfWork);
        unset($persisters[$className]);
        $persistersRef->setValue($unitOfWork, $persisters);
        $persistersRef->setAccessible(false);
    } else {
        $em->persist($entity);
        $em->flush();
    }
}


この関数にpersistしたいエンティティを投げることで任意のカラムで任意のIDを登録できます。
普段のプラグイン運用等では使わないと思いますが、
初期インストール後になにかをやってくれるプラグイン というところの幅が広がるのではないかと思います。

ご返信頂きありがとうございました。
468
投稿日時: 2017/10/1 9:17
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: Doctrineのpersist()時、auto increment対象のIDを指定したい
情報提供ありがとうございます。
こういった手段があるのですね。勉強になります。

1点だけ気になったのは、オートインクリメントやシーケンスの数値も自動的に進められるのでしょうか?
オートインクリメント等の数値はそのままで通常運用で新規登録を進めていった結果、
ある数値までIDが採番された時に、
IDの重複エラーが発生すると困るかと思いました。

(例えば、ID=3を指定してエンティティを保存し、
 後日、新規登録を操作した時、3回目で重複エラーが発生する等)

時々、このコミュニティでもデータ移行を行って運用を開始したものの、
しばらくしてから商品や注文の新規登録が出来なくなった
(オートインクリメントやシーケンスは1のままスタートした事によるID採番時の重複エラーが原因)
という話を見かけますので・・・。

いつか時間がある時に、そのあたりの挙動は確認したいと思いますが、
任意のIDで登録できるのは、データ移行では便利かと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

nicketium
投稿日時: 2017/10/1 22:19
対応状況: 解決済
新米
登録日: 2016/11/30
居住地: 札幌市
投稿: 10
Re: Doctrineのpersist()時、auto increment対象のIDを指定したい
オートインクリメントの値についてですが、
一度こちらで実行したものを確認したところ、挿入した値の次 にはなっているようです。

dtb_product インストール直後のレコードが ID2まで登録済

先述関数でID99指定でインサート

product_id=99のレコードが生成される。
AUTO INCREMENT = 100 を確認。

doctrineを経由してますので、そのあたりの処理もやってくれているみたいですね。
ただ、 ID99でインサート→ID4でインサート した場合等は未検証なので、
今のところ、テーブルをクリエイトした直後にIDを昇順ソートした状態でインサートすれば問題はでない。

というところでしょうか。


----------------
***************************************
Nickel Lab. 合同会社

スクラッチ開発、UI/UXを得意としており、アニメーションを使いながらも快適な操作性を実現するECサイトを開発しています。
***************

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,856名です
総投稿数は109,989件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1291
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.