因为这个问题听起来很简单,但我还是坚持住了。因此,我的意思基本上是假设我有一个包含title和description的表,可以从这两个表中搜索
return Model::where('title','LIKE','%'.$search.'%')
->OrWhere('description','LIKE','%'.$search.'%')->get();现在我想知道的是如何从description而不是title中找到有说服力的结果
就像我搜索一个术语,mydescription,,它存在于描述中,而不是在标题中,并且雄辩地返回了我的模型。
,但我如何知道从雄辩的结果中返回的结果是描述的一部分,而不是标题?
边注:我知道我可以通过regex对返回的进行字符串搜索,但是在我的情况下,它的性能并不有效。因为(a)我的描述相当大。这是一个longText字段(b),一旦我对我的模型进行了搜索,我就会发现再次搜索string来重复自己是有点儿不合适的。
发布于 2018-10-30 16:47:08
若要在单个查询中执行此操作,您必须向查询结果中添加一个新列,该列指示搜索结果的位置。
这可以通过使用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",
},
],
}发布于 2018-10-30 15:50:20
您可以执行两个查询而不是一个查询:
$fromTitle = Model::where('title','LIKE','%'.$search.'%')->get();
$fromDesc = Model::where('description','LIKE','%'.$search.'%')->get();
return ['title'=>$fromTitle, 'description'=>$fromDesc];发布于 2018-10-30 15:57:58
也许您需要将$search变量与您从雄辩中获得的标题和描述属性进行比较?
$collection = Model::where('title','LIKE','%'.$search.'%')
->OrWhere('description','LIKE','%'.$search.'%')->get();
$isDescription = $collection->description === $search;我不确定这是最好的解决办法。
https://stackoverflow.com/questions/53068090
复制相似问题