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 サイトの他の関連記事を参照してください。