Получите пользователей, которые подписаны только в Laravel Cashier - все пользователи, а не пользователь

Вот запрос, который я пытался написать, и выдает ошибку

$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();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
113
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Решение здесь 😁

$users =  User::whereHas('subscriptions', function (Builder $q) {
        return $q->active();
    })->get()->toArray();

Хорошего дня

выдает ошибку App\Http\Controllers\DashboardController::App\Http\Controlle‌​rs\{closure}(): Аргумент №1 ($q) должен быть типа Illuminate\Database\Query\Builder, Illuminate\Database\Eloquent \Builder задан, вызывается в /var/www/creditfixrr.code/vendor/laravel/framework/src/Illum‌​inate/Database/Eloqu‌​ent/Builder.php в строке 1199

Nevil Saul Blemuss 07.10.2022 15:49

@NevilSaulBlemuss Это просто означает, что вы используете неправильный импорт Builder. Либо исправьте это с помощью use Illuminate\Database\Query\Builder; в верхней части файла, либо измените Builder $q на просто $q (удалите подсказку типа)

Tim Lewis 07.10.2022 16:09

я разобрался спасибо за помощь

Nevil Saul Blemuss 07.10.2022 16:35
Ответ принят как подходящий

использовать

$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, чтобы справиться с этим.

Tim Lewis 07.10.2022 16:50

@TimLewis только что узнал, что в laravel 9 есть метод withWhereHas. Спасибо за обновление.

Abdulla Nilam 07.10.2022 18:27

Без проблем! Вы не представляете, сколько раз я делал что-то вроде $function = function(...), а потом Model::with(['whatever' => $function])->whereHas('whatever', $function)->get(); рад, что они наконец добавили что-то, чтобы сделать это чище; ваше здоровье!

Tim Lewis 07.10.2022 18:30

Сделай это так

$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();

Это даст вам только подписанных пользователей. Но если вы выберете всех пользователей, а затем примените фильтр к полученному результату, то каждая строка будет извлечена из базы данных, что не является хорошей практикой.

Другие вопросы по теме