Laravel Mysql 数据库连接 2 个多态父项

Laravel Mysql DB join 2 polymorphic parents

我正在尝试创建一个可以处理连接多个多态父项的查询。

$this->query->join('time_records AS time', function($join) use($taskTable, $projectTable) {
    $join->on('time.parent_id', '=', $taskTable . '.id', 'and')
        ->on('time.parent_type', '=', Task::class, 'and')
        ->on('time.parent_id', '=', $projectTable . '.id', 'or')
        ->on('time.parent_type', '=', Project::class, 'and');
});

这失败了,因为它不喜欢字符串而不是列名。不过我觉得这样好像不太对。

这只是整个报告的一部分class。在这种情况下,多态 table time_records 需要加入 2 table。但基本上需要 1 个连接。所以连接的所有时间记录都在time名称下,这样使用的列都符合整体查询的结构。

我在这里加入了许多 table,以创建一种虚假的等级制度。

categories.name as lev1, projects.name AS lev2, tasks.name AS lev3, time.time AS time

这在某种程度上是我构建 select 的方式,这样集合就可以对名称进行分组,然后将其下的项目分组,最后得到一个我的应用程序可以读取/理解的集合层次结构。

我要寻找的只是一个最终结果,我可以在其中引用 time_records table,其中包含基于项目或任务的行数据(因此,如果它是一个项目,那么 lev3 将只是 null/blank)。我不介意它是否不是连接,或者它是否只是一个原始 SQL 查询。我只是无法用正确的方法来结束我正在寻找的结果,同时将其保持为 1 个查询(因为集合已经足够繁重)。

我想出了一个办法,更多的是换个思路。

而不是根据您想要的顺序进行查询,只需调整 select。因此,如果您想要来自 table 的数据,请为它们添加 select 参数,如果不是 "hide",则在结果中添加 table,但始终将其加入。

这部分我没有在我的问题中展示,现在我确实看到它对于隔离为什么这是一个难以弄清楚的问题非常重要。

颠倒顺序,而不是从顶层向下,而是从下向上,所以从 time_records 作为查询的主要 table 开始,然后加入所有其余部分,即与之相关的 table 可以更简单地连接起来。

所以最后的答案是我完全看错了。它有助于写出原始 SQL 输出以找到它并手动查询。