如何重命名从 Laravel 的查询生成器返回的字段 withCount (又名 $asColumn)[重复]

问题描述 投票:0回答:2

我有一个模型,我正在尝试链接多个具有不同关系的 withCounts。这是一个例子:

    return MyModel::query()
        ->withCount(array('users'=>function($query){
            $query->where('enabled', '=', 1);
        }))
        ->withCount(array('users'=>function($query){
            $query->where('phone', '=', "123-4567");
        }))
        ->get();

这不起作用,因为 Laravel 在我的结果中自动返回一个名为“users_count”的 Snake_case 字段名称,基本上这意味着查询的启用部分被电话部分覆盖。

我稍微查看了一下 Builder.php 类,注意到 $asColumn 是返回的名称:https://github.com/laravel/framework/commit/67b821dde62e64f94aa7d99f1806ecf03ea323e5,就像上面提到的那样,这只是一个 Snake_case关系的 $name + '_count'。

有没有办法在不使用原始查询的情况下制作自定义 $asColumn ,以便我可以获得两个结果?我基本上希望我的结果是enabled_users_count和phone_users_count,或者类似的东西。我也不想进行 2 个不同的查询。

php laravel eloquent
2个回答
19
投票

此功能自 2016 年 9 月 8 日发布的 Laravel 5.3.7 起可用。

假设您使用的是 5.3.7 或更高版本,您只需在

as new_name
方法中的关系字符串中添加
withCount
,它就会将计数字段命名为
new_name_count
。所以,你的代码看起来像:

return MyModel::query()
    ->withCount(array('users as enabled_users'=>function($query){
        $query->where('enabled', '=', 1);
    }))
    ->withCount(array('users as phone_users'=>function($query){
        $query->where('phone', '=', "123-4567");
    }))
    ->get();

此代码将生成一个

enabled_users_count
字段和一个
phone_users_count
字段。

如果您不是这个版本,并且无法升级,您将需要采用定义新关系的路线,如@RossWilson所述。


Laravel >= 5.5

从 Laravel 5.5 开始,如果指定列别名,则不会附加

_count
后缀。因此,从 5.5 开始,上面的示例将生成
enabled_users
phone_users
字段,而不是
enabled_users_count
phone_users_count
字段。

但是,如果没有指定别名,则仍会自动附加

_count
后缀。因此,
withCount('users')
仍会生成
users_count
字段。


7
投票

我知道的唯一方法是为这些条件定义不同的关系,然后使用

withCount
与这些例如

public function enableUsers()
{
    return $this->hasMany(User::class) //Or whatever the relationship is
        ->where('enabled', '=', 1);
}

然后:

MyModel::withCount('enabledUsers', 'phoneUsers')->get();

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.