Laravel侦察人际关系

时间:2019-12-16 13:53:51

标签: php mysql laravel laravel-scout

我似乎无法弄清楚如何在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。

2 个答案:

答案 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