バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

管理機能

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
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を登録できます。
普段のプラグイン運用等では使わないと思いますが、
初期インストール後になにかをやってくれるプラグイン というところの幅が広がるのではないかと思います。

ご返信頂きありがとうございました。
フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
   Doctrineのpersist()時、auto increment対象のIDを指定したい nicketium 2017/9/29 1:42
     Re: Doctrineのpersist()時、auto increment対象のIDを指定したい 468 2017/9/29 11:59
     » Re: Doctrineのpersist()時、auto increment対象のIDを指定したい nicketium 2017/9/30 20:56
         Re: Doctrineのpersist()時、auto increment対象のIDを指定したい 468 2017/10/1 9:17
           Re: Doctrineのpersist()時、auto increment対象のIDを指定したい nicketium 2017/10/1 22:19

 



ログイン


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

統計情報

総メンバー数は89,353名です
総投稿数は110,082件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1652
8
red
1570
9
mcontact
1304
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.