預設情況下,Eloquent 關聯假設雙方模型使用同一資料庫連線。當 `ModelA` 與 `ModelB` 分屬不同連線(甚至不同資料庫伺服器)時,需手動構建查詢建構器並注入關聯實例。
// ModelB
public function a()
{
return $this->belongsTo(ModelA::class);
}
// ModelB
public function a()
{
// 1. 建立目標模型實例並切換連線
$instance = new ModelA;
$instance->setConnection('connection_name_for_a'); // config/database.php 中定義的連線名
// 2. 取得該連線下的查詢建構器
$query = $instance->newQuery();
// 3. 手動實例化 BelongsTo 關聯物件
// 建構子: new BelongsTo(Builder $query, Model $parent, $foreignKey, $ownerKey, $relationName)
return new \Illuminate\Database\Eloquent\Relations\BelongsTo($query, $this);
}
若專案大量跨庫關聯,可建立 Trait 復用:
trait CrossDatabaseRelations
{
protected function belongsToCross($modelClass, $connection, $foreignKey = null, $ownerKey = null, $relation = null)
{
$instance = new $modelClass;
$instance->setConnection($connection);
return new \Illuminate\Database\Eloquent\Relations\BelongsTo(
$instance->newQuery(), $this, $foreignKey, $ownerKey, $relation
);
}
}
// 使用
class ModelB extends Model
{
use CrossDatabaseRelations;
public function a()
{
return $this->belongsToCross(ModelA::class, 'mysql_a');
}
}