Laravel のデータベース間の BelongsToMany 関係
Laravel では、belongsToMany 関係により、2 つのモデル間に多対多の関連付けを確立できます。 。ただし、モデルが異なるデータベースに存在する場合、関係を設定するには追加の構成が必要です。このチュートリアルでは、Laravel で複数のデータベースにわたってbelongsToMany 関係を作成するプロセスを説明します。
BelongsToMany 関係の設定
最初のモデルで、関係が定義されています。では、belongsToMany メソッドを次のように指定できます:
<code class="php">public function bs() { return $this->belongsToMany('B', 'a_bs', 'a_id', 'b_id'); }</code>
ただし、このリレーションシップにアクセスしようとすると、ターゲット モデルのデータベースにピボット テーブルが存在しないことを示すエラーが発生する可能性があります。
ピボット テーブルのデータベースの指定
この問題を解決するには、ピボット テーブルが存在するデータベースを明示的に指定する必要があります。これを行うには、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 データベースを使用している場合は、関係が適切に機能することを確認するために追加の手順が必要です。
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>
トランザクションの処理:
接続された SQLite データベースを処理する場合、トランザクションは使用しないでください。 。これらは ATTACH DATABASE 操作を妨げ、データを非表示にする可能性があります。
テスト後のクリーンアップ:
接続された SQLite で単体テストを実行している場合データベースの場合は、各テストの後にクリーンアップ アクションを実行して、後続のテストで適切なデータベース状態を確保する必要があります。テーブルを切り詰めるか、添付されたデータベース ファイルをコピーして上書きすることができます。
以上がLaravel でデータベース間で BelongsToMany 関係を確立するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。