Я использую Algolia в качестве поискового драйвера и просто пытаюсь искать в моих записях пользователей, основываясь на том факте, что у них есть отношения.
App\User::has('restaurant')->search('Chris')->get();
Я использую Laravel Scount и хочу найти всех пользователей, у которых есть ресторан, а затем перечислить их, но получаю ошибку
BadMethodCallException с сообщением «вызов неопределенного метода
Осветить \ Database \ Query \ Builder :: Поиск ()
Как я могу искать на основе отношений?
Лучше всего было бы добавить атрибут int ресторана в ваши данные, отправляемые в Алголию, чтобы вы могли положиться на атрибут «где». Я не знаю, как выглядят ваши данные, поэтому код может потребовать некоторых изменений.
Где очень ограничено, это только с равными операциями на целых: 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"
Добавьте этот пакет в ваш проект: https://github.com/algolia/laravel-scout-algolia-macros
Создать restaurant_count
атрибут
public function toSearchableArray()
{
$record = $this->toArray();
$record['resturant_count'] = count($this->restaurants);
return $record;
}
Reindex.
Поиск таким образом:
User::search('Chris')->with('filters' => 'restaurant_count>0')->get();
Дайте мне знать, если это сработало для вас.
Это обычно происходит, когда у модели нет черты
Добавьте признак в модель, чтобы функция поиска была доступна. Также необходимо указать правила поиска (столбцы, по которым вы хотите выполнить поиск) через свойство $ searchable.
class User extends Authenticatable
{
use SearchableTrait;
.
.
.
}
и в этой функции контроллера:
App\User::search('chris')->with('restaurant')->get();
Возвращает пользователя с Крисом и рестораном
использование first()
вместо get()
чтобы это работало.