如何重命名从Laravel的Query Builder withCount返回的字段(又名$ asColumn)

ste*_*cks 4 php mysql laravel

我有一个模型,我试图链接多个withCounts与不同的关系.这是一个例子:

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

这不起作用,因为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个不同的查询.

pat*_*cus 11

此功能自Laravel 5.3.7起,于2016-09-08发布.

假设您使用的是5.3.7或更高版本,则只需要as new_namewithCount方法中添加关系字符串,并将计数字段命名为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();
Run Code Online (Sandbox Code Playgroud)

此代码将生成enabled_users_count字段和phone_users_count字段.

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


Rwd*_*Rwd 7

我所知道的唯一方法是为这些条件定义不同的关系,然后将它们withCount与例如

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

然后:

MyModel::withCount('enabledUsers', 'phoneUsers')->get();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!