ホームページ > データベース > mysql チュートリアル > Laravelで複数のデータベースにわたるBelongsToMany関係にアクセスする方法は?

Laravelで複数のデータベースにわたるBelongsToMany関係にアクセスする方法は?

Barbara Streisand
リリース: 2024-11-03 07:53:03
オリジナル
630 人が閲覧しました

How to Access a BelongsToMany Relationship Across Multiple Databases in Laravel?

Laravel の複数のデータベースにわたる BelongsToMany 関係へのアクセス

異なるデータベースに保存されたモデルを操作する場合、Laravel のbelongsToMany 関係で問題が発生する可能性があります。ピボット テーブルがターゲット モデルと同じデータベースにない場合。これを解決するには、ピボット テーブルのデータベース名を明示的に指定する必要があります。

これを行うには、ピボット テーブルを含むモデル内のbelongsToMany 関係を次のように変更します。

<code class="php">public function bs()
{
    $database = $this->getConnection()->getDatabaseName();
    return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id');
}</code>
ログイン後にコピー

このアプローチにより、Laravel はリレーションシップを保持するモデルに対応するピボット テーブルをデータベース内で検索するようになり、問題が解決されます。

ただし、プロジェクトで SQLite データベースが使用されており、単体テストを実行する場合は、追加の考慮事項が必要です。が必要です。 SQLite では、ピボット テーブルへのアクセスを容易にするために、ターゲット データベースをテスト接続に接続する必要があります。これは、次のコードで実現できます:

<code class="php">public function bs()
{
    $database = $this->getConnection()->getDatabaseName();
    if (is_file($database)) {
        $connection = app('B')->getConnection()->getName();
        $name = $this->getConnection()->getName();
        \Illuminate\Support\Facades\DB::connection($connection)->statement("ATTACH DATABASE '$database' AS $name");
        $database = $name;
    }
    return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id');
}</code>
ログイン後にコピー

トランザクションの使用法に注意することが重要です。現在の接続でトランザクションが使用されている場合、ATTACH DATABASE ステートメントは失敗します。逆に、関連する接続でトランザクションが使用されている場合、結果のデータは現在の接続から隠蔽されます。

接続されたデータベースの後にクリーンアップするには、移行ロールバックを実行するか、構造を維持しながらテーブルを切り捨てることができます。

その他のオプションには、接続されたデータベースを一時ファイルにコピーし、テスト後にソースを置き換えたり、SQLite データベース ファイルの簡単にアクセスできる性質を利用したりすることが含まれます。

以上がLaravelで複数のデータベースにわたるBelongsToMany関係にアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート