【问题标题】:Find a sentence that contains a word in text from database从数据库中查找包含文本中单词的句子
【发布时间】:2021-09-18 01:22:34
【问题描述】:

我想用一个例子来解释我想要完成的事情。假设我的posts 表中有两行。

It snows a lot in winter in Norway. While it barely snows where I live.

I run four miles every morning. I am trying to get fit.

当我搜索in winter 时,我想得到句子It snows a lot in winter in Norway.

我知道我可以通过以下方式获得该行:

$posts = \App\Models\Post::where('body', 'like', "%{in winter}%")->get();

但我不确定如何获得确切的句子。

【问题讨论】:

  • 大括号似乎是多余的。 .. "%in winter%" ..
  • 除非您将单个句子作为字段进行跟踪,否则一旦您将实体取出,您就需要直接使用 PHP 来完成其余的工作。看到这个:stackoverflow.com/a/12239752/231316
  • Laravel 有获取特定列值的方法,但正确的方法取决于您使用的 Laravel 版本。
  • @Don'tPanic 我正在使用 laravel 8

标签: php mysql laravel laravel-query-builder


【解决方案1】:

虽然在技术上可能使用SQL 来获取准确的句子,但最好使用 PHP 从集合中获取准确的句子。

我创建了一个使用集合的示例(因为您使用的是 Laravel),从您提供的 Post 查询开始(尽管我确实从 like 字符串中删除了花括号)。

1.获取带有body like search query的帖子集合

$posts = Post::where('body', 'like', "%in winter%")->get();

2。将帖子集合映射到单个句子。展平以删除空句子。

$postSentences = $posts->map( function($post) {
   // preg split makes sure the text is splitted on . or ! or ?
   return preg_split('/\.|\?|!/', $post->body); 
})->flatten();

3.使用过滤器和 Str::contains() 获取对应的句子

$matchingSentences = $postSentences->filter( function($sentence) {
    return Str::contains($sentence, 'in winter');
});

$matchingSentences 应该返回:

Illuminate\Support\Collection 
    all: [
       "It snows a lot in winter in Norway",
    ],
}

该示例可能会根据您的要求进行更改/缩​​短。但这应该可以解决上述问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多