Laravel Eloquent,多个模式查询

时间:2017-07-28 09:22:06

标签: php mysql laravel laravel-5 eloquent

我有以下查询(简化):

$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_onerelation_two关系,我还需要为每行加载另一个关系,relation_threerelation_four,具体取决于{{1}的值}}

我遇到的问题是ModelOne->object来自ModelOne以及schema1relation_three中使用的表格relation_four来自schema2

这两个模型的个别protected $connectionprotected $table变量设置正确。

我收到的错误是relationship_threerelationship_four的表不存在,因为子查询检查错误的架构。

有人可以建议如何解决这个问题吗?浏览了一些文档,但无法找到解决方案。

2 个答案:

答案 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();`

如果有人可以提出一些改进或更有效的方法,请告诉我