php mysql全文搜索由id加入的多个表

时间:2015-02-11 06:47:33

标签: php mysql laravel eloquent query-builder

我已经阅读了一段时间的全文搜索,我已经阅读了一些文章说它可能但是他们没有提供样本查询,

我找不到如何使用全文搜索搜索由ID加入的多个表的解决方法

这是我的缩小表看起来像

enter image description here

这是我到目前为止所拥有的

    $users = User::select('users.*','departments.department_name')
    ->join('departments', 'departments.id', ' =', 'users.dept_id')
    ->whereRaw(
        "MATCH(user_name) AGAINST(? IN BOOLEAN MODE)", 
        array($q)
        )
    ->paginate(10);
}

搜索时如何包含 department_name ?请帮助,提前谢谢

2 个答案:

答案 0 :(得分:2)

我认为你太接近你的结果了。使用查询构建器(但未经过测试),此代码应该可以工作:

$user = DB::table('users')
->selectRaw('users.*, departments.department_name')
->join('departments', 'departments.id', ' =', 'users.dept_id')
->whereRaw(
    "MATCH(users.user_name) AGAINST(? IN BOOLEAN MODE) OR
     MATCH(departments.department_name) AGAINST(? IN BOOLEAN MODE)",
    array($q, $q))
)->paginate(10);

在MySQL表格中使用FULLTEXT的位置以及http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html不在哪里时,也存在一些限制。优良作法是在FULLTEXT index子句中使用的列或列列表上包含MATCH()

答案 1 :(得分:2)

您可以创建“物化视图”。 http://en.wikipedia.org/wiki/Materialized_view

基本上是一个表,它是JOIN的结果,并在其上创建一个全文索引。

CREATE TABLE materialized (FULLTEXT idx (user_name,department_name)) 
 SELECT u.id,user_name,department_name 
 FROM users u INNER JOIN departments d ON (d.id = dept_id) 

然后,您可以在该表上运行查询..

SELECT * FROM materialized WHERE MATCH(user_name,department_name) AGAINST('test' IN BOOLEAN MODE)

但......

您需要定期更新表格(或更新基础表格时) - 最简单的方法是DROP并重新创建 - 或者您可以使用TRUNCATE然后INSERT INTO ... SELECT ... FROM ...格式。

(更详细的方案涉及触发器以保持'视图'更新,甚至观看binlog,并根据'视图'重播更新)