laravel 在不该反对的时候给我反对

laravel gives me object when it shouldn't

所以我在投资者模型上有以下范围:

public function scopeCountUsersInRegionForCompany(Builder $query, $companyName, $regionCode)
{
    return $query->select('users.*')
                 ->join('user_profile', 'user_profile.user_id', '=', 'users.id')
                 ->join('investments', 'users.id', '=', 'investments.user_id')
                 ->join('offerings', 'investments.offering_id', '=', 'offerings.id')
                 ->join('companies', 'offerings.company_id', '=', 'companies.id')
                 ->where('companies.slug', '=', $companyName)
                 ->where('user_profile.region', '=', $regionCode)
                 ->count();

}

在以下上下文中使用:

public function regionCountForCompany($slug)
{
    $regions = [];
    $totalUsersForCompany = Investor::countUsersForCompany($slug);

    if ($totalUsersForCompany === 0) {
        return [];
    }

    foreach ($this->getAllRegions() as $regionCode => $regionName) {

        $regions[$regionName] = (Investor::countUsersInRegionForCompany($slug, $regionCode) / Investor::countUsersForCompany($slug)) * 100;
    }


    if (max($regions) > 0) {
        return $regions;
    } else {
        return [];
    }
}

注意每个循环:

    foreach ($this->getAllRegions() as $regionCode => $regionName) {

        $regions[$regionName] = (Investor::countUsersInRegionForCompany($slug, $regionCode) / Investor::countUsersForCompany($slug)) * 100;
    }

以下调用:

Investor::countUsersInRegionForCompany($slug, $regionCode)

将 return 1 之后每隔一次它 returns: Object of class Illuminate\Database\Eloquent\Builder could not be converted to int 如果我这样做: var_dump(is_object(Investor::countUsersInRegionForCompany($slug, $regionCode))) 它有一次错误,然后每次被调用时都为真。

这是导致此问题的唯一范围。如果我在范围内进行 var 转储以获取变量 $query 而不是像您看到的那样对它进行 return 处理,它会以 int 形式返回。

如果我在调用这组特定代码的浏览器中到达终点,所有这些都有效,没有关于对象或任何其他错误。测试如下:

public function it_should_return_region_count_for_investors() {
    $this->createInvestment();

    $investor = factory(User::class)->create([
        'role_id' => 4
    ]);

    $response = $this->actingAs($investor)
                     ->call('GET', 'api/v1/investors-signedup-by-jurisdiction/');

    $this->assertNotEmpty(json_decode($response->getContent()));
}

响应返回为:Object of class Illuminate\Database\Eloquent\Builder could not be converted to int(它实际上呈现了一个带有此消息的 html laravel 错误页面)

这是怎么回事?

这是因为 Laravel 的一个有点愚蠢的检查。当它调用范围时,它会检查函数必须 return 并添加后备链接:

return call_user_func_array([$this->model, $scope], $parameters) ?: $this;

所以当你的函数 returns 1 - 三元运算符等于 true 和结果 returns 时,当它 return 0 - 三元运算符失败时,你得到 this 代替。

我建议你不要 return 来自范围。完成修改查询,而不是 return 结果。将 count() 放在范围之外,如

Investor::usersInRegionForCompany($slug, $regionCode)->count()