如何在Laravel scout中使用whereHas方法,
我一直在尝试在“姓名”列和“关系”列中搜索。我的代码如下; /// 我已经建立了一个可搜索的模型。我想改变搜索方法如下如何在Laravel scout中使用whereHas方法,,laravel,full-text-search,Laravel,Full Text Search,我一直在尝试在“姓名”列和“关系”列中搜索。我的代码如下; /// 我已经建立了一个可搜索的模型。我想改变搜索方法如下 $posts = ContentForSearch::search($search)->orWhere(function ($query) use ($search) { $query->whereHas('tags', function ($q) use ($search) {
$posts = ContentForSearch::search($search)->orWhere(function ($query) use ($search) {
$query->whereHas('tags', function ($q) use ($search) {
$q->where('tag', 'LIKE', "%{$search}%");
});
})
->orderBy($sort, $order)
->paginate($limit)->load("content_type","content_sub_type");
为什么代码不起作用?如何修复它?
模型为:
class ContentForSearch extends Model{
use Searchable;
protected $table = 'content';
public function searchableAs()
{
return 'contents_index';
}
public function toSearchableArray()
{
$array = $this->toArray();
// Customize array...
return ["name"=> null];
}
public function content_type()
{
return $this->belongsTo(ContentType::class, 'content_type_id');
}
public function tags()
{
return $this->belongsToMany(ContentTag::class, 'content_content_tags', 'content_id', 'content_tags_id')->withTimestamps();
}
// * * *
全文搜索使用
algolia
和elastic
的方式,您想要保留whereHas()
关系方法似乎有些奇怪。在我看来,这是一个非此即彼的情况,要么你想要sql关系搜索,要么你想要全文,如果你想要全文,我会把所有标签映射到索引构建。所以像这样的东西会有用的
public function toSearchableArray()
{
$customArray = $this->toArray();
$index = 1;
$this->tags->each(function(Tag $tag) use (&$customArray, &index) {
$customArray['tag' . $index++] = $tag->tag;
});
return $customArray;
}
这将导致与此类似的对象被索引
{
'name' => 'x',
'tag1' => 'comment',
'tag2' => 'post',
}
现在搜索将提供类似的功能
ContentForSearch::search($search);
给出了误差;语法错误,意外的“索引”(T_字符串),期望变量(T_变量)我需要一行代码和你的代码,发布的代码似乎很好。你对这一行有进一步的了解吗?这应该是非常直接的解决方法,用代码更新你的问题,让我们看看它?正如我们所说,在生产中有类似的解决方案
ContentForSearch::search($search);