バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > その他 > 複数のDBの出し分けの方法について 4.X系

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ktm
投稿日時: 2024/7/28 16:45
対応状況: −−−
新米
登録日: 2024/7/28
居住地:
投稿: 4
複数のDBの出し分けの方法について 4.X系

EC-CUBE : 4.1.2-p1
サーバーOS : Linux
DBサーバー : MySQL 5.7.44
WEBサーバー: Apache/2.4.59 (Debian)
PHP 7.4.33

▼やりたいこと
複数のデータベースを利用してサイトごとにDBの参照先を変更したい

サイトAとサイトBがありますが、
サイトBでは、ユーザー周りのテーブル関係(dtb_customerなど約10テーブルほど)はサイトAを参照するようにしたいです。
方法としては、
▫️独自プラグインを作成(サイトB)
1. .envファイルにDBを追加


DATABASE_URL=サイトB
サイトA_DATABASE_URL=サイトA



2. doctrine.yamlの修正


省略...

 orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                auto_mapping: true
                dql:
                    string_functions:
                        NORMALIZE: Eccube\Doctrine\ORM\Query\Normalize
                    numeric_functions:
                        EXTRACT: Eccube\Doctrine\ORM\Query\Extract
                filters:
                    option_nostock_hidden:
                        class: Eccube\Doctrine\Filter\NoStockHiddenFilter
                        enabled: false
                    incomplete_order_status_hidden:
                        class: Eccube\Doctrine\Filter\OrderStatusFilter
                        enabled: false
            user:
                connection: user
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                mappings:
                    独自プラグイン:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/app/Plugin/独自プラグイン名/Entity'
                        prefix: 'Plugin\独自プラグイン名\Entity'
                        alias: 独自プラグイン名
                dql:
                    string_functions:
                        NORMALIZE: Eccube\Doctrine\ORM\Query\Normalize
                    numeric_functions:
                        EXTRACT: Eccube\Doctrine\ORM\Query\Extract
                filters:
                    option_nostock_hidden:
                        class: Eccube\Doctrine\Filter\NoStockHiddenFilter
                        enabled: false
                    incomplete_order_status_hidden:
                        class: Eccube\Doctrine\Filter\OrderStatusFilter
                        enabled: false



3. Plugin配下にEntity, Repositoryを継承して配置

-----------------------------
このようなやり方で実現しようと考えて開発中なのですが、
Entity, Repository内の多量のパスの修正やエラーの箇所も次々と出てくるので開発に難航しております。
もっと効率のいい方法でDBの出しわけを実施できる方法が知りたいです。

有識者の方、ご教授いただけましたら幸いです。
mcontact
投稿日時: 2024/7/29 11:19
対応状況: −−−
登録日: 2022/1/22
居住地:
投稿: 1462
Re: 複数のDBの出し分けの方法について 4.X系
https://qiita.com/ma33588/items/fca931a585de65e78c99


----------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EC-CUBEインテグレートパートナー【ゴールド】ランク
M&I Works
URL: https://miworks.biz/
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ktm
投稿日時: 2024/7/30 12:35
対応状況: −−−
新米
登録日: 2024/7/28
居住地:
投稿: 4
Re: 複数のDBの出し分けの方法について 4.X系
ご投稿ありがとうございます。

説明不足がありましたが、
今回の環境(STG, 本番)によってDB名が異なるため以下の静的にDB名を指定する方法では不可ということでした。

例:DB名
STG
DATABASE_URL: サイトA_STG
本番
DATABASE_URL: サイトA


https://qiita.com/ma33588/items/fca931a585de65e78c99
上記の

@ORM\Table(name="サイトA.dtb_product_size")


このような方法ですと、本番環境でしか対応できず
STG環境での対応やテストができないという問題がありました。

環境に応じても対応でき、4.X系での実装方法を検討しておりました。
ktm
投稿日時: 2024/9/8 17:45
対応状況: −−−
新米
登録日: 2024/7/28
居住地:
投稿: 4
Re: 複数のDBの出し分けの方法について 4.X系
誰も答えられないですか
残念です
red
投稿日時: 2024/9/13 9:56
対応状況: −−−
登録日: 2010/2/15
居住地: 東京都
投稿: 1574
Re: 複数のDBの出し分けの方法について 4.X系
viewで対応するほうが楽そうですね


----------------
EC-CUBEのカスタマイズ、トラブル解決承ります
お気軽にお問い合わせ下さい
https://www.ec-cube.net/integrate/partner/partner.php?partner_id=690

ktm
投稿日時: 2024/9/14 15:55
対応状況: −−−
新米
登録日: 2024/7/28
居住地:
投稿: 4
Re: 複数のDBの出し分けの方法について 4.X系
ご回答、アドバイスのほど誠にありがとうございます。

viewですね、検討いたします。
ただ、上位の意向としてはyamlファイルでの設定、以下の公式の方法でを希望しておりますので、そちらの方で出来ればと思っております。

https://symfony.com/doc/4.x/doctrine/multiple_entity_managers.html

改めて現状をお話ししたいと思います

---
EC-CUBE 4.1系で、複数のデータベースを利用し、エンティティごとにデータベースを切り替える要件があります。
特定のエンティティ(例えばCustomer)に対して、以下のようなデータベースの出し分けを行いたいです。

default(デフォルトデータベース)
user(ユーザー周りのデータベース)
この2つのデータベースをエンティティごとに使い分けることを目指しています。

これまで試した手順
1. 環境変数設定(.envファイル)
まず、2つのデータベース接続情報を.envに設定します。

# default データベース
.env

DATABASE_URL=mysql://xxxx/dbname_02

# user データベース
DATABASE_USER_URL=mysql://xxxx/dbname_01


2. doctrine.yaml での設定
次に、doctrine.yamlファイルで2つのデータベースを定義し、それぞれのエンティティマネージャを設定します。


doctrine.yaml

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver: 'pdo_mysql'
                charset: utf8mb4
                server_version: "%env(resolve:DATABASE_SERVER_VERSION)%"
                url: '%env(resolve:DATABASE_URL)%'
            user:
                driver: 'pdo_mysql'
                charset: utf8mb4
                server_version: "%env(resolve:DATABASE_SERVER_VERSION)%"
                url: '%env(resolve:DATABASE_USER_URL)%'

    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                auto_mapping: true
            user:
                connection: user
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                mappings:
                    Eccube:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Eccube/Entity'
                        prefix: 'Eccube\Entity'
                        alias: Eccube


3. CustomerRepository.php でのDB切り替え
CustomerRepositoryでは、データベース(default)とデータベース(user)を使い分けます。


CustomerRepository.php

namespace Eccube\Repository;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Doctrine\Query\Queries;
use Eccube\Entity\Customer;

class CustomerRepository extends AbstractRepository
{
    private $defaultEntityManager;
    private $userEntityManager;

    public function __construct(
        Queries $queries,
        EntityManagerInterface $defaultEntityManager,
        EntityManagerInterface $userEntityManager,
        EccubeConfig $eccubeConfig
    ) {
        parent::__construct($defaultEntityManager, Customer::class);

        $this->queries = $queries;
        $this->defaultEntityManager = $defaultEntityManager;
        $this->userEntityManager = $userEntityManager;
        $this->eccubeConfig = $eccubeConfig;
    }

    public function getCustomerById($id)
    {
        // user データベースから読み取る
        $conn = $this->userEntityManager->getConnection();
        $sql = 'SELECT * FROM customer WHERE id = :id';
        $stmt = $conn->prepare($sql);
        $stmt->execute(['id' => $id]);

        return $stmt->fetch();
    }

}


4. services.yaml によるエンティティマネージャの設定
CustomerRepositoryで、defaultとuserエンティティマネージャを注入するようにservices.yamlを設定します。


services.yaml

services:
    Eccube\Repository\CustomerRepository:
        arguments:
            $defaultEntityManager: '@doctrine.orm.default_entity_manager'
            $userEntityManager: '@doctrine.orm.entity_manager.user'



現在の状況と問題点
このようになっておりますが、DBはデフォルトにしか向かない状況です(userに向いてほしい)

しかし、実際にはすべての操作がdefault(dbname_02)データベースで行われているようで、userデータベースに対して正しく接続されていない状態です。

何か気付くことや、修正すべきことがあればご教授いただけましたら幸いです。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は93,309名です
総投稿数は111,006件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2315
5
umebius
2085
6
yuh
1841
7
h_tanaka
1752
8
red
1574
9
mcontact
1462
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
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.