Вот запрос, который я пытался написать, и выдает ошибку
$users =User::has('subscriptions', function (Builder $q) {
$q->whereNotNull('ends_at');
})->get();
Получение этой ошибки
SQLSTATE[42601]: Syntax error: 7 ERROR: SELECT * with no tables specified is not valid LINE 1: ...sers"."id" = "subscriptions"."user_id") = (select * where "e... ^ (SQL: select * from "users" where (select count(*) from "subscriptions" where "users"."id" = "subscriptions"."user_id") = (select * where "ends_at" > now) and "users"."deleted_at" is null)
Когда я пишу этот код, я получаю результаты, но мне нужно отфильтровать результат, чтобы получить список подписанных пользователей без вызова User::all(), а затем перейти к фильтрации.
User::has('subscriptions')->get();






Решение здесь 😁
$users = User::whereHas('subscriptions', function (Builder $q) {
return $q->active();
})->get()->toArray();
Хорошего дня
@NevilSaulBlemuss Это просто означает, что вы используете неправильный импорт Builder. Либо исправьте это с помощью use Illuminate\Database\Query\Builder; в верхней части файла, либо измените Builder $q на просто $q (удалите подсказку типа)
я разобрался спасибо за помощь
использовать
$users = User::with(['subscriptions' => static function ($query) {
$query->whereNotNull('ends_at');
}])->get();
Читать Сдерживание жадных нагрузок
Чтобы запросить, вам нужно сначала загрузить отношение
subscriptions.
Извините, мой комментарий немного искажен из-за ошибки копирования/вставки. Этот ответ в основном правильный, но проверьте эту функцию и в Laravel 9: laravel.com/docs/9.x/…. ->with() и ->whereHas() обычно используются одновременно для фильтрации и ограничения, поэтому Laravel добавил ->withWhereHas() в Laravel 9, чтобы справиться с этим.
@TimLewis только что узнал, что в laravel 9 есть метод withWhereHas. Спасибо за обновление.
Без проблем! Вы не представляете, сколько раз я делал что-то вроде $function = function(...), а потом Model::with(['whatever' => $function])->whereHas('whatever', $function)->get(); рад, что они наконец добавили что-то, чтобы сделать это чище; ваше здоровье!
Сделай это так
$users = User::with(['subscriptions' => static function ($query) { $query->whereNotNull('ends_at'); }])->get();
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
$users = User::with(['subscriptions' => function ($query) {
return $query->whereNotNull('ends_at');
}])->get();
Или,
$users = User::with('subscriptions')->whereHas('subscriptions', function ($query) {
return $query->whereNotNull('ends_at');
})->get();
Это даст вам только подписанных пользователей. Но если вы выберете всех пользователей, а затем примените фильтр к полученному результату, то каждая строка будет извлечена из базы данных, что не является хорошей практикой.
выдает ошибку App\Http\Controllers\DashboardController::App\Http\Controllers\{closure}(): Аргумент №1 ($q) должен быть типа Illuminate\Database\Query\Builder, Illuminate\Database\Eloquent \Builder задан, вызывается в /var/www/creditfixrr.code/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php в строке 1199