1

我使用 Algolia 作为我的搜索驱动程序,我只是试图根据他们是否有关系的事实来搜索我的用户记录。

App\User::has('restaurant')->search('Chris')->get(); 

我使用 Laravel Scount 并想搜索所有拥有餐厅的用户然后列出它们,但我收到的错误是

带有消息“调用未定义的方法 Illuminate\Database\Query\Builder::search()”的 BadMethodCallException

如何根据关系进行搜索?

4

3 回答 3

1

最好的方法是在发送到 Algolia 的数据中添加餐厅 int 属性,以便您可以依赖“where”属性。我不知道您的数据是什么样的,因此代码可能需要一些修改。

哪里非常有限,它只能在整数上进行相等的操作:https ://laravel.com/docs/scout#where-clauses

解决方案一:使用where方法

首先,覆盖该toSearchableArray方法以具有类似的内容:

public function toSearchableArray()
{
    $record = $this->toArray();

    $record['has_resturant'] = (int) !empty($this->restaurants);

    return $record;
}

使用命令重新索引所有内容php artisan scout:import "App\User"

解决方案 2:Algolia 宏包

将此包添加到您的项目中:https ://github.com/algolia/laravel-scout-algolia-macros

创建restaurant_count属性

public function toSearchableArray()
{
    $record = $this->toArray();

    $record['resturant_count'] = count($this->restaurants);

    return $record;
}

重新索引。

用这种方式搜索:

User::search('Chris')->with('filters' => 'restaurant_count>0')->get();

让我知道这是否对你有用。

于 2018-01-25T15:05:42.813 回答
0

使用first()而不是get()使其工作。

于 2018-01-25T08:55:23.997 回答
0

这通常发生在模型缺乏特征时

Add the trait to the model, you want the search function to be available on You also need to specify the search rules(the columns you want to run the search on) via the $searchable property.

class User extends Authenticatable
{
   use SearchableTrait;
   .
   .
   .
}

and in that controller function:

 App\User::search('chris')->with('restaurant')->get();

This returns user with chris joined with restaurant

于 2018-01-25T08:35:48.430 回答