我正在尝试创建一个查询,该查询可以处理连接多个多态父母的问题。
$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需要连接到两个表。但它需要是一个基本的加入。因此,所有加入的时间记录都在time名称下,因此所使用的列都与整个查询的结构一致。
我在这里加入了许多表,以创建一种假的层次结构。
categories.name as lev1, projects.name AS lev2, tasks.name AS lev3, time.time AS time
这在某种程度上是我构造select的方式,这样集合就可以对名称进行分组,然后对项目进行分组,最后形成一个集合层次结构,我的应用程序可以读取/理解这个层次结构。
我所要寻找的只是一个最终结果,在这个结果中,我可以引用time_records表,该表包含基于项目还是任务的数据(因此,如果它是一个项目,则lev3将为空/空)。我不介意它是否不是一个join,或者它甚至只是一个原始SQL查询。我只是不能用正确的方式来结束我正在寻找的结果,同时保持1查询(因为集合已经负担够多了)。
发布于 2016-11-24 20:21:17
我想出了一种方法,这更多的是一种心态的改变。
而不是根据您想要的顺序进行查询,只需调整select。因此,如果您想要表中的数据,为它们添加select参数,如果不是在结果中“隐藏”表,而是始终将其连接起来。
这一部分我没有在我的问题中显示,我现在确实看到,在隔离这是一个很难弄清楚的相当重要的部分。
倒转顺序,而不是从顶层向下,从自下而上开始,所以从time_records开始作为查询的主表,并加入所有其他表,这样两个与其相关的表都可以更简单地连接起来。
所以最终的答案是我完全看错了这个。它帮助编写原始SQL输出,以查找该输出并手动查询。
https://stackoverflow.com/questions/40772510
复制相似问题