如何搜索是否存在关系?

时间:2018-01-25 07:25:08

标签: php laravel algolia laravel-scout

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

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

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

  

带消息的BadMethodCallException'调用未定义的方法   照亮\数据库\查询\生成器::搜索()'

如何根据关系进行搜索?

3 个答案:

答案 0 :(得分:1)

最好的方法是在发送给Algolia的数据中添加restaurant int属性,这样你就可以依赖"其中"属性。我不知道您的数据是什么样的,因此代码可能需要进行一些修改。

在哪里非常有限,它只对ints采用相同的操作:https://laravel.com/docs/scout#where-clauses

解决方案1:使用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 Macro软件包

将此包添加到您的项目中: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();

如果这对您有用,请告诉我。

答案 1 :(得分:0)

当模型缺乏特质时,就会出现这种情况

将特征添加到模型中,您希望搜索功能可用。您还需要通过$ searchable属性指定搜索规则(要运行搜索的列)。

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

并在该控制器功能中:

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

这将返回带有chris加入餐厅的用户

答案 2 :(得分:0)

使用 { xtype: 'textfield', fieldLabel: 'Address', width: '100%', enableKeyEvents : true, listeners: { keyup : function(obj) { alert('test fire ' + obj.getValue()); } } }, 代替first()使其正常工作。