【问题标题】:Laravel Eloquent, multiple schema queryLaravel Eloquent,多模式查询
【发布时间】:2017-07-28 18:40:16
【问题描述】:

我有以下查询(简化):

$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,具体取决于ModelOne->object 的值。

我遇到的问题是ModelOne 来自schema1,而relation_threerelation_four 中使用的表来自schema2

两个模型都正确设置了各自的 protected $connectionprotected $table 变量。

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

谁能建议如何解决这个问题?浏览了文档,但找不到解决方案。

【问题讨论】:

  • 您可以加载这两个关系并在逻辑中使用正确的关系。另外,schema1schema2 是什么?不同的数据库?
  • 我会尝试同时加载两者,看看是否能以我需要的方式获得结果,如果由于两个表包含相同的 ID 而加载了两个关系可能会导致问题,但需要使用原来如此。
  • 是的,schema1schema2 是不同的数据库,由于现有的业务逻辑,需要保持这种状态。
  • 我认为这个问题最好用polymorphism解决:让多个子模型基于schema2扩展1个基础模型

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

也许不是最优雅的解决方案,但通过调用关系并加入如下:

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

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

【讨论】:

    【解决方案2】:

    我建议至少将不同的数据库关系与不同的字段分开。这样您就可以同时加载两者(如 cmets 中所建议的那样)并区分控制器/模型代码中的逻辑。

    另外,我猜你需要在模型级别定义连接名称,如果还没有完成的话:

    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

    【讨论】:

    • 连接已在模型级别定义。在 Call to undefined method Illuminate\Database\Query\Builder::resource() 这样的连接中指定连接时引发错误。将阅读链接的文章,谢谢
    猜你喜欢
    • 2017-07-30
    • 2021-05-12
    • 2017-10-22
    • 2014-10-31
    • 2014-10-25
    • 2019-07-21
    • 1970-01-01
    • 2022-12-05
    • 2019-01-15
    相关资源
    最近更新 更多