laravel如何找到搜索结果是从哪里找到的或者从哪里找到的部分

v440hwme  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(262)

这个问题听上去很简单,但我还是很难回答。所以我的意思是,假设我有一个包含 title 以及 description 我将使用

return Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();

现在我想知道的是如何从 description 而不是 title 就像我搜索一个术语mydescription,它存在于description而不是title中,并且雄辩地返回我的模型。
但是我怎么知道雄辩结果返回的结果是描述的一部分而不是标题呢?
旁注:我知道我可以通过regex雄辩地对返回的描述进行字符串搜索,但在我的例子中,这并不是高效的性能。因为(a)我的描述很大。这是一个长文本字段(b)一旦我在我的模型上搜索了一下,然后我发现通过搜索字符串来重复一遍有点不容易。

56lgkhnf

56lgkhnf1#

要在单个查询中执行此操作,必须向查询结果中添加一个新列,以指示在何处找到搜索结果。
这可以通过使用sql case来实现。以下是一般示例:

$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”的新列,指示在何处找到搜索结果。
示例:

$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();

结果:

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",
    },
    ],
}
toiithl6

toiithl62#

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

$fromTitle = Model::where('title','LIKE','%'.$search.'%')->get();
$fromDesc = Model::where('description','LIKE','%'.$search.'%')->get();

return ['title'=>$fromTitle, 'description'=>$fromDesc];
pgpifvop

pgpifvop3#

也许您需要将$search变量与从elokent获得的title和description属性进行比较?

$collection = Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();
$isDescription = $collection->description === $search;

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

相关问题