php搜索表格,php – Laravel – 多个表格上的全文搜索

我正在使用Laravel 4和Eloquent模型来处理我们正在进行的项目.

数据库符合3NF,一切都很好.从MySQL版本开始,所有MySQL表都从InnoDB切换回MyISAM. 5.6(InnoDB中的全文搜索仅支持5.6及更高版本).

在创建一些数据库搜索过滤器时,我发现使用Eloquent模型与查询生成器相比存在一些不足.具体而言,特别是在尝试对多个表中的列进行全文搜索时(并保留在Eloquent的对象上下文中).

为简单起见,我们有以下数据库结构:

--projects

--id

--name

--status

--...

--users

--id

--...

--roles

--id

--project_id

--user_id

--...

--notes

--id

--project_id

--user_id

--note

--....

以下代码(问题的简化和最小化)目前工作正常,但全文搜索仅适用于一个表(项目表).

if (Request::isMethod('post'))

{

$filters = array('type_id','status','division','date_of_activation','date_of_closure');

foreach ($filters as $filter) {

$value = Input::get($filter);

if (!empty($value) && $value != -1) {//-1 is the value of 'ALL' option

$projects->where($filter,'=',$value);

}

}

$search = Input::get('search');

if (!empty($search)) {

$projects->whereRAW("MATCH(name,description) AGAINST(? IN BOOLEAN MODE)",array($search));

}

}

// more code here...

// some more filters...

// and at the end I am committing the search by using paginate(10)

return View::make('pages/projects/listView',

array(

"projects" => $projects->paginate(10)

)

);

我需要扩展全文搜索以包括以下列 – projects.name,projects.description和notes.note.

当试图找到如何使用Eloquent时,我们继续回到查询生成器并运行自定义查询,这将工作正常但我们将面临这些问题/缺点:

> Eloquent返回模型对象时,Query Builder返回一个数组.由于我们正在扩展每个模型以包含方法,我们真的不想放弃Eloquent模型的真棒.而且我们真的不想在返回结果上使用Eloquent Project :: find($id)来再次获取对象.

>我们正在链接“where”方法以获得任意数量的过滤器

分配给它以及代码可重用性.好像混合

Eloquent和Query Builder声明将共同打破我们的链接.

>为了这个项目的一致性,我们希望所有的数据库查询

留在Eloquent的内涵.

阅读Laravel的文档和API,我找不到使用Eloquent运行原始SQL查询的方法.有哪些RAW()但它不够广泛.我认为这是设计限制,但它仍然是一个限制.

所以我的问题是:

>是否可以在多个表的列上运行全文搜索,仅在Eloquent中.我在网上遇到的每一条信息都提到了使用Query Builder.

>如果没有,是否可以使用查询生成器搜索并返回Eloquent对象? (无需在数组结果上运行Project :: find($id)).

>最后,是否可以将Eloquent和Query Builder链接在一起,同时只在稍后使用get()或paginate(10)进行提交.

据我所知,Eloquent和Query Builder是不同的生物.但是如果混合两者都可以,或者使用Eloquent来运行原始SQL查询,我相信Eloquent模型将变得更加健壮.在我看来,只使用查询生成器有点像使用Laravel框架.

希望得到一些有关这方面的见解,因为Laravel的论坛/社区似乎仍在不断发展,尽管我发现它是一个了不起的框架!

谢谢,我感谢您的任何输入:)

解决方法:

首先,您可以在模型中使用查询范围

public function scopeSearch($query, $q)

{

$match = "MATCH(`name`, `description`) AGAINST (?)";

return $query->whereRaw($match, array($q))

->orderByRaw($match.' DESC', array($q));

}

这样你就可以获得“雄辩的收藏”作为回报

$projects = Project::search(Input::get('search'))->get();

然后,要搜索到笔记,您可以制作更复杂的范围,以加入笔记并在那里搜索.

标签:php,laravel,mysql,eloquent,laravel-4

来源: https://codeday.me/bug/20190831/1772648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值