Reputation: 113
Let' say I want to create a phone book for a big company with multiples offices. My database is composed by 3 tables: - User - City (represent the office's location) - Role (a User can have multiple roles)
I'd like to create a form with 3 different fields to perform the query, how can I do that ?
For now I've got only 1 field and this is my main model User
```
public function city()
{
return $this->belongsTo(City::class);
}
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function toSearchableArray()
{
$office = $this->city;
$array = [
'name' => $this->name,
'phone' => $this->phone,
'postal_code' => $office->postal_code,
'city' => $office->name,
];
return $array;
}
```
How would you do a research with Algolia and add filters to the query (City and Roles) ?
How should I store Roles ? Plain text ?
Thank you
Upvotes: 1
Views: 880
Reputation: 1193
Scout only support numbers in the where
clause: https://laravel.com/docs/5.5/scout#where-clauses
I would recommend to also store the ID for offices and do search like:
User::search('')->where('office_id', 2)->get();
For Roles, because you have multiple values, you should store them as in an array.
You cannot use where
on arrays, so you will need to leverage the callback parameter to add a filter
entry in the options array.
User::search('', function ($algolia, $query, $options) {
$options = array_merge($options, [
'filters' => 'roles:engineer'
]);
return $algolia->search($query, $options);
})->get();
You can find Algolia's doc about filtering here: https://www.algolia.com/doc/guides/searching/filtering/
Please let me know if that worked for you.
Upvotes: 1