在Laravel 中跨多個資料庫存取BelongsToMany 關係
使用儲存在不同資料庫中的模型時,您可能會遇到Laravel的ownToMany 關係式問題當資料透視表與目標模型不在同一資料庫中。為了克服這個問題,需要明確指定資料透視表的資料庫名稱。
為此,請修改包含資料透視表的模型中的ownToMany 關係,如下所示:
<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中文網其他相關文章!