我正在尝试创建一个可以处理加入多个多态父项的查询。
$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');
});
由于不喜欢字符串而不喜欢列名,因此失败。但我确实觉得这似乎不对。
这只是整个报告类的一部分。在这种情况下,有两个表,多态表time_records
需要加入。但它基本上需要1次加入。因此,所有加入的时间记录都在time
名称下,因此所使用的列都与整个查询的结构一致。
我在这里加入了许多表,以创建一种虚假的层次结构。
categories.name as lev1, projects.name AS lev2, tasks.name AS lev3, time.time AS time
这就是我如何构建select,以便集合可以对名称进行分组,然后将项目分组并向下分组,最后得到我的应用程序可以读取/理解的集合层次结构。
我正在寻找的是一个最终结果,我可以根据项目或任务(如果它的项目是lev3那样)来引用包含该行数据的time_records
表只是为空/空白)。如果它不是连接,或者它甚至只是一个原始SQL查询,我不介意。我只是无法绕过正确的方式来结束我正在寻找的结果,同时保持它为1查询(因为集合足够的税收)。
答案 0 :(得分:0)
我想出了一种方式,而且更多的是改变了心态。
而不是根据您想要的顺序进行查询,只需调整选择即可。因此,如果您需要来自表的数据,请为它们添加select参数,否则为#34;隐藏"结果中的表格,但总是加入。
这一部分我没有在我的问题中显示,我确实看到现在分离为什么这是一个难以理解的事情是非常重要的。
反转顺序,而不是从顶层向下,从下往上,所以从time_records
开始作为查询的主表并加入所有其余的,这样两个表都与它可以更简单。
所以最后答案是我完全以错误的方式看待这个问题。它有助于写出原始的SQL输出来查找并手动查询。