我有一个高级搜索表单,该表单可以过滤来自mySql数据库的结果。有一部分是关键字搜索,应该与所有相关表上的任何文本字段匹配。
这是上述搜索表单代码。
<form action="/search" method="POST">
Keyword: <input type="text" name="keyword">
Matching: <input type="radio" name="keywordControl" value="AND"> Match every words<br>
<input type="radio" name="keywordControl" value="OR"> Match any words<br>
<input type="submit">
</form>
表格:
CREATE TABLE `User` (
`id` INT,
`firstName` VARCHAR(100),
`lastName` VARCHAR(100),
`email` VARCHAR(100),
`address` VARCHAR(400)
);
CREATE TABLE `savedLinks` (
`id` INT,
`userId` INT,
`linkName` VARCHAR(100),
`linkURL` VARCHAR(400),
`linkNote` VARCHAR(100),
);
CREATE TABLE `BlogEntry` (
`id` INT,
`userId` INT,
`entryTitle` VARCHAR(100),
`entryExcerpt` VARCHAR(100),
`entryBody` TEXT,
);
我需要:
如果我通过这些参数进行搜索:
关键字:火影忍者区域51
keywordControl:AND
我希望在所有表中都看到与火影忍者和area51匹配的结果。
但是,我只能在同一张表上过滤结果。我设法显示类似>>的结果
“先生Naruto
”,其地址为“ Area51 lane ...”]]]保存链接同时包含“ Naruto
”和“ Area51任何关于“ Naruto
跑步”和“ Area51但是我无法带来类似结果
“ Mister Naruto
任何人保存了有关“ Naruto”的链接,并在博客上发表了有关“ Area51
”因为后者需要搜索所有表。这是我的laravel雄辩的代码。
$keyword = urldecode($request->input('keyword')); $keywords = preg_split('/\s+/', $keyword, -1, PREG_SPLIT_NO_EMPTY); $users = User::when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) { $query->where(function ($query) use ($keywords, $keywordControl) { foreach ($keywords as $keyword) { if ($keywordControl == 'AND') { $query->whereRaw("CONCAT(firstName,lastName,email,address) LIKE ?", "%{$keyword}%"); } else { $query->orWhereRaw("CONCAT(firstName,lastName,email,address) LIKE ?", "%{$keyword}%"); } } }); }) ->when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) { $query->whereHas('savedLinks', function ($query) use ($keywords, $keywordControl) { $query->where(function ($query) use ($keywords, $keywordControl) { foreach ($keywords as $keyword) { if($keywordControl == 'AND'){ $query->whereRaw("CONCAT(linkName,linkURL,linkNote) LIKE ?", "%{$keyword}%"); } else { $query->orWhereRaw("CONCAT(linkName,linkURL,linkNote) LIKE ?", "%{$keyword}%"); } } }); }); }) ->when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) { $query->whereHas('blogEntry', function ($query) use ($keywords, $keywordControl) { $query->where(function ($query) use ($keywords, $keywordControl) { foreach ($keywords as $keyword) { if($keywordControl=='AND') { $query->whereRaw("CONCAT(entryTitle,entryExcerpt,entryBody) LIKE ?", "%{$keyword}%"); } else { $query->orWhereRaw("CONCAT(entryTitle,entryExcerpt,entryBody) LIKE ?", "%{$keyword}%"); } } }); }); }) ->get();
我的想法是,或者如果我应该创建另一个表并在同一字段中合并所有这些文本,则仅出于搜索目的。我不知道这是一个好主意。请指导我,谢谢!
我有一个高级搜索表单,该表单可以过滤来自mySql数据库的结果。有一部分是关键字搜索,应该与所有相关表上的任何文本字段匹配。这就是所说的搜索...
您是否定义了用户,SavedLinks和Blog的关系?对于此查询,用户必须与所讨论的模型具有正确的关系:
# User model
public function savedLinks()
{
return $this->hasMany(SavedLink::class, 'userId', 'id');
}
public function blogEntries()
{
return $this->hasMany(BlogEntry::class, 'userId', 'id');
}