【问题标题】:Get users that are only subscribed in Laravel Cashier - all users not a user获取仅订阅 laravel 收银员的用户 - 所有用户不是用户
【发布时间】:2022-10-18 05:04:36
【问题描述】:

这是我尝试编写的查询并给出了错误

$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 mysql laravel eloquent laravel-8


    【解决方案1】:

    利用

    $users = User::with(['subscriptions' => static function ($query) {
        $query->whereNotNull('ends_at');
    }])->get();
    

    阅读Constraining Eager Loads

    查询需要先加载subscriptions关系。

    【讨论】:

    • 抱歉,由于复制/粘贴错误,我的评论有些混乱。这个答案是大多正确,但也可以在 Laravel 9 中查看此功能:laravel.com/docs/9.x/…->with()->whereHas() 通常同时用于过滤和约束,因此 Laravel 在 Laravel 9 中添加了 ->withWhereHas() 来处理。
    • @TimLewis 刚刚知道 laravel 9 中有一个方法 withWhereHas。感谢您的更新。
    • 没问题!你不知道我做了多少次$function = function(...),然后Model::with(['whatever' => $function])->whereHas('whatever', $function)->get();很高兴他们终于添加了一些东西来使那个更干净;干杯!
    【解决方案2】:

    解决方案在这里?

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

    祝你有美好的一天

    【讨论】:

    • 给出错误 AppHttpControllersDashboardController::AppHttpControllers{closure}(): Argument #1 ($q) must be of type IlluminateDatabaseQueryBuilder, IlluminateDatabaseEloquentBuilder given, 在 /var/www/creditfixrr.code/vendor/laravel/framework/src/Illuminate/ 中调用Database/Eloquent/Builder.php 第 1199 行
    • @NevilSaulBlemuss 这只是意味着您使用了错误的 Builder 导入。通过文件顶部的use IlluminateDatabaseQueryBuilder; 修复它,或者将Builder $q 更改为$q(删除类型提示)
    • 我想通了谢谢你的帮助
    【解决方案3】:
    $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();
    

    这将只为您提供订阅用户。但是,如果您获取所有用户,然后对获取的结果应用过滤器,那么将从数据库中获取每一行,这不是一个好习惯。我希望你得到你的答案。

    祝你有美好的一天。

    【讨论】:

      【解决方案4】:

      像这样做

      $users = User::with(['subscriptions' => static function ($query) { $query->whereNotNull('ends_at'); }])->get();

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2016-02-19
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2015-01-27
      • 2012-08-05
      • 2021-02-15
      • 2021-12-06
      相关资源
      最近更新 更多