Как искать, если отношения существуют?

Я использую Algolia в качестве поискового драйвера и просто пытаюсь искать в моих записях пользователей, основываясь на том факте, что у них есть отношения.

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

Я использую Laravel Scount и хочу найти всех пользователей, у которых есть ресторан, а затем перечислить их, но получаю ошибку

BadMethodCallException с сообщением «вызов неопределенного метода
Осветить \ Database \ Query \ Builder :: Поиск ()

Как я могу искать на основе отношений?

1

Решение

Лучше всего было бы добавить атрибут int ресторана в ваши данные, отправляемые в Алголию, чтобы вы могли положиться на атрибут «где». Я не знаю, как выглядят ваши данные, поэтому код может потребовать некоторых изменений.

Где очень ограничено, это только с равными операциями на целых: 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: пакет Алголия Макро

Добавьте этот пакет в ваш проект: 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();

Дайте мне знать, если это сработало для вас.

1

Другие решения

Это обычно происходит, когда у модели нет черты

Добавьте признак в модель, чтобы функция поиска была доступна. Также необходимо указать правила поиска (столбцы, по которым вы хотите выполнить поиск) через свойство $ searchable.

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

и в этой функции контроллера:

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

Возвращает пользователя с Крисом и рестораном

0

использование first() вместо get() чтобы это работало.

0
По вопросам рекламы [email protected]