2013-04-18 25 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