使用运算符AND / OR在多表上搜索多个关键字

问题描述 投票:0回答:1

我有一个高级搜索表单,该表单可以过滤来自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

    • ”,他在博客上发表了关于“ Area51
  • 任何人保存了有关“ 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数据库的结果。有一部分是关键字搜索,应该与所有相关表上的任何文本字段匹配。这就是所说的搜索...

mysql laravel laravel-5 laravel-5.7
1个回答
0
投票

您是否定义了用户,SavedLinks和Blog的关系?对于此查询,用户必须与所讨论的模型具有正确的关系:

# User model
public function savedLinks()
{
    return $this->hasMany(SavedLink::class, 'userId', 'id');
}

public function blogEntries()
{
    return $this->hasMany(BlogEntry::class, 'userId', 'id');
}
© www.soinside.com 2019 - 2024. All rights reserved.