2016-11-23 64 views
1

我想創建一個查詢,可以處理加入多個多態父母。Laravel MySQL DB加入2多態父母

$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'); 
}); 

由於它不喜歡字符串而不是列名,因此失敗。但我確實認爲這看起來不正確。

這只是整個報告類的一部分。在這種情況下,有2個表格需要加入多態表格time_records。但基本上需要1加入。因此,所有加入的記錄都在time名稱下,因此所使用的列都符合整個查詢的結構。

我在這裏加入很多表格來創建一種假等級。

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

,有點我如何組織選擇這樣一個集合可以再組名稱,然後組其下的項目和向下,用收集層次結構,我的應用程序可以讀取結束了/明白了。

我要找的所有內容都是一個最終結果,我可以參考time_records表,該表包含基於其項目或任務的行的數據(因此,如果項目的lev3將僅爲null /空白)。我不介意它不是一個連接,或者它甚至只是一個原始的SQL查詢。我只是無法圍繞正確的方式將我的頭圍繞在查找結果的同時保持1查詢(因爲集合徵稅足夠)。

回答

0

我想出了一種方式,它更多地改變了心態。

而不是基於您想要的順序查詢查詢,只需調整選擇。所以,如果你想從一個表中獲取數據,爲它們添加選擇參數,如果不是「隱藏」結果中的表,但總是加入它。

這部分我沒有在我的問題中顯示,我確實看到現在在隔離爲什麼這是一個難以解決的問題時相當重要。

顛倒順序,而不是從頂層向下走,從底層向上走,所以從time_records開始,作爲查詢的主表並加入所有其餘的,這樣與它有關的兩個表都可以加入更簡單。

所以最後的答案是我完全看着這個錯誤的方式。它有助於寫出原始SQL輸出以查找並手動查詢。