我似乎无法弄清楚如何在Laravel Scout的1个查询中的2个表中进行搜索。由于目前不重要的特定原因,我不想只运行原始查询。现在我有这个要搜索:
我的关系:
namespace App;
use Laravel\Scout\Searchable;
class Users extends Model
{
use Searchable;
public function searchableAs(){
return 'users_index';
}
public function toSearchableArray(){
return $this->toArray();
}
public function originalUser(){
return $this->belongsTo(OriginalUser::class);
}
}
这是控制器:
use App\OriginalUser;
use App\Users;
use App\Groups;
class SomeController extends Controller{
public function index(){
$group = Group::where('group_id',1)->first();
return Users::search('something')->where('group_id',$group->id)->get();
}
}
现在,这将返回在其中一列中具有“内容”的用户,就像这样:
[
{
"id": "1",
"original_user_id": "1",
"username": "something"
"original_user": {
"id": "1",
"username":"test"
}
}
]
但是我也需要我的代码来返回此记录:
[
{
"id": "2",
"original_user_id": "2",
"username": "nope"
"original_user": {
"id": "2",
"username": "something"
}
}
]
因此,当它在结果的关系中匹配时,我也希望返回该记录。我也尝试过制作OriginalUser
模型searchable
,但是我只是停留在这一点上。
documentation不够清晰,我无法找出如何实际获得关系列也要与搜索值匹配的结果。我发现,唯一能说明官方文档中模型关系的东西是:
// You may also add records via relationships...
$user->orders()->searchable();
我已经尝试过了,但是没有显示其他记录。(当然,我在代码中将orders
更改为originalUser()
)
有人知道如何使用laravel scout在1个“搜索”中搜索多个模型吗?
编辑: 我使用的不是Algolia,而是mysql。
答案 0 :(得分:2)
不幸的是,目前似乎无法使用Scout和MySQL驱动程序。
今天我在周围寻找一个完全相同的问题的解决方案,我发现了一些建议,即可以通过toSearchAbleArray方法在要搜索的模型上添加关系来做到这一点:https://laracasts.com/discuss/channels/laravel/scout-how-to-search-in-relations-and-counts?page=1#reply=329201
但这对我不起作用。几个小时后,我发现了2016年关于该主题的回购上的一个问题,这表明他们还没有着手实施此问题:https://github.com/yabhq/laravel-scout-mysql-driver/issues/5
答案 1 :(得分:0)
如果您有兴趣,我正在从事类似的工作。 我还需要搜索相关模型,因此我将Eloquent-joins项目(这使得在雄辩模型中进行真正的联接,而不是Laravel使用的急切的加载系统)与mysql scout驱动程序结合在一起。
在相关模型中进行搜索的唯一方法是使用完整的字段名(例如original_users.usernamename)在联接表上进行where操作。 我不得不重写侦察员mysql驱动程序,以搜索即使在指定的相关模型中也要使用的字段,并在查询过程中使用联接系统(以及项目中需要的其他功能)。
对于eloquent-joins项目,我制作了一个分叉,我将对其进行更新以与Laravel 6及其新的驱动程序系统一起使用。 https://github.com/mix359/eloquent-joins/tree/dev
如果有人感兴趣,我还有一点时间,我可以尝试使用重写的驱动程序制作一个软件包(该结构与原始驱动程序有所不同,因为它不是以发布在软件包中的想法开发的)
Byez