首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从orWhere部件中找到搜索结果

如何从orWhere部件中找到搜索结果
EN

Stack Overflow用户
提问于 2018-10-30 15:45:36
回答 3查看 553关注 0票数 0

因为这个问题听起来很简单,但我还是坚持住了。因此,我的意思基本上是假设我有一个包含titledescription的表,可以从这两个表中搜索

代码语言:javascript
复制
return Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();

现在我想知道的是如何从description而不是title中找到有说服力的结果

就像我搜索一个术语,mydescription,,它存在于描述中,而不是在标题中,并且雄辩地返回了我的模型。

,但我如何知道从雄辩的结果中返回的结果是描述的一部分,而不是标题?

边注:我知道我可以通过regex对返回的进行字符串搜索,但是在我的情况下,它的性能并不有效。因为(a)我的描述相当大。这是一个longText字段(b),一旦我对我的模型进行了搜索,我就会发现再次搜索string来重复自己是有点儿不合适的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-30 16:47:08

若要在单个查询中执行此操作,您必须向查询结果中添加一个新列,该列指示搜索结果的位置。

这可以通过使用SQL CASE来完成。以下是通用示例:

代码语言:javascript
复制
$select  = "*, CASE";
$select .= " WHEN (title LIKE '%".$search."%' and description LIKE '%".$search."%') THEN 'title-description'";
$select .= " WHEN (title LIKE '%".$search."%') THEN 'title'";
$select .= " WHEN (description LIKE '%".$search."%') THEN 'description'";
$select .= " END as FoundIn";

Model::selectRaw($select)->where('title','LIKE','%'.$search.'%')->orWhere('description','LIKE','%'.$search.'%')->get();

这将向名为"FoundIn“的结果中添加一个新列,该列指示搜索结果的位置。

实际例子:

代码语言:javascript
复制
$search = "Dummy";
$select  = "*, CASE";
$select .= " WHEN (topic LIKE '%".$search."%' and subject LIKE '%".$search."%') THEN 'topic-subject'";
$select .= " WHEN (topic LIKE '%".$search."%') THEN 'topic'";
$select .= " WHEN (subject LIKE '%".$search."%') THEN 'subject'";
$select .= " END as FoundIn";

Message::selectRaw($select)->where('topic','LIKE','%'.$search.'%')->orWhere('subject','LIKE','%'.$search.'%')->get();

结果:

代码语言:javascript
复制
Illuminate\Database\Eloquent\Collection {#2929
    all: [
    App\Message {#2947
        id: 3,
        topic: "Dummy Title",
        subject: "Dummy Description",
        created_at: null,
        updated_at: null,
        FoundIn: "topic-subject",
    },
    App\Message {#2940
        id: 4,
        topic: "Dummy Title",
        subject: "Smart Description",
        created_at: null,
        updated_at: null,
        FoundIn: "topic",
    },
    App\Message {#2941
        id: 5,
        topic: "Smart Title",
        subject: "Dummy Description",
        created_at: null,
        updated_at: null,
        FoundIn: "subject",
    },
    ],
}
票数 1
EN

Stack Overflow用户

发布于 2018-10-30 15:50:20

您可以执行两个查询而不是一个查询:

代码语言:javascript
复制
$fromTitle = Model::where('title','LIKE','%'.$search.'%')->get();
$fromDesc = Model::where('description','LIKE','%'.$search.'%')->get();

return ['title'=>$fromTitle, 'description'=>$fromDesc];
票数 1
EN

Stack Overflow用户

发布于 2018-10-30 15:57:58

也许您需要将$search变量与您从雄辩中获得的标题和描述属性进行比较?

代码语言:javascript
复制
    $collection = Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();
$isDescription = $collection->description === $search;

我不确定这是最好的解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53068090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档