2013-04-18 27 views
2

我有兩個表格:postspages。基於關鍵字,我想搜索兩個表中不同列的關鍵字。這兩個表格沒有相關的內容。通過eloquent query在多個表格中搜索

我已經爲每個表格寫了兩個查詢。以下是查詢:

$result1 = Post::where('title_en', 'LIKE', '%' . $keyword . '%') 
       ->or_where('title_np', 'LIKE', '%' . $keyword . '%') 
       ->order_by('id', 'desc') 
       ->paginate(10); 

$result2 = Page::where('title', 'LIKE', '%' . $keyword . '%') 
       ->or_where('content', 'LIKE', '%' . $keyword . '%') 
       ->order_by('id', 'desc') 
       ->paginate(10); 

以上查詢返回兩個不同的Laravel\Paginator對象。但是我想要一個Laravel\Paginator對象,這樣就可以在頁面上顯示單個分頁,這個頁面既可以用於查詢,也可以用於實現上述兩個查詢功能的單個查詢。我將如何能夠做到這一點?

+0

SQL UNION是最好的方法,IMO。但你可能不得不用這個原始查詢。 – Usman

回答

1

因爲它們是不相關的表格,所以你需要做一些欺騙手段,這對於雄辯處理來說太複雜了,你需要做一些類似於下面的事情來將兩個查詢結合在一起,並且仍然能夠完成你的極限/訂購的組合查詢:

$results = DB::query('SELECT id, title FROM ( 
SELECT id, title FROM `post` where `title_np` LIKE "%'.$keyword.'%" OR `title_en` LIKE "%'.$keyword.'%" 
UNION ALL 
SELECT id, title FROM `page` where `title` LIKE "%'.$keyword.'%" OR `content` LIKE "%'.$keyword.'%" 
) temp_table 
ORDER BY `id` desc 
LIMIT 0, 10 
') 

NB上面是未經檢驗的,純粹的方法的一個例子,你需要採取,不知道這實際上會工作。

+0

使用聯合工作原始查詢,但顯然'paginate()'不適用於原始查詢。有沒有辦法讓原始查詢與paginate一起工作? – SUB0DH

+0

雖然可能是這種情況,但您可能需要手動執行此操作,即在查詢中自行設置「limit」和「skip」。 – duellsy

+0

我想我沒有別的辦法,只能自己在查詢中設置'limit'和'skip'。感謝你的回答。 – SUB0DH