我有以下查询(简化):
$q = ModelOne::with('relation_one', 'relation_two')
->whereHas('relation_three', function ($q) {
$q->where('object', 'Obj1');
})
->whereHas('relation_four', function ($q) {
$q->where('object', 'Obj2');
})
->get();`
它可以很好地加载relation_one
和relation_two
关系,我还需要为每行加载另一个关系,relation_three
或relation_four
,具体取决于{{1}的值}}
我遇到的问题是ModelOne->object
来自ModelOne
以及schema1
和relation_three
中使用的表格relation_four
来自schema2
。
这两个模型的个别protected $connection
和protected $table
变量设置正确。
我收到的错误是relationship_three
或relationship_four
的表不存在,因为子查询检查错误的架构。
有人可以建议如何解决这个问题吗?浏览了一些文档,但无法找到解决方案。
答案 0 :(得分:0)
我建议至少将不同的数据库关系分成不同的字段。这样,您就可以加载两者(如注释中所示)并区分控制器/模型代码中的逻辑。
另外,我猜你需要在模型级别定义连接名称,如果还没有完成:
class Model_Two_Relation {
protected $connection = 'your-database-name-from-config';
}
您还可能希望在关系连接条件中指定连接:
$q = ModelOne::with('relation_one', 'relation_two')
->whereHas('relation_three', function ($q) {
$q->from('resources.one')->where('object', 'Obj1');
})
->whereHas('relation_four', function ($q) {
$q->from('resources.two')->where('object', 'Obj2');
})
->get();
链接:http://fideloper.com/laravel-multiple-database-connections
答案 1 :(得分:0)
也许不是最优雅的解决方案,但通过调用关系和加入如下工作:
$q = ModelOne::with('relation_one', 'relation_two')
->with(['relation_three' => function ($q) {
$q->leftJoin(
'schema1.model_one',
'table_three.id',
'=',
'model_one.object_id'
)
->where('object', 'Obj1');
}])
->with(['relation_four' => function ($q) {
$q->leftJoin(
'schema1.model_one',
'table_four.id',
'=',
'model_one.object_id'
)
->where('object', 'Obj2');
}])
->get();`
如果有人可以提出一些改进或更有效的方法,请告诉我