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()
所以我在投资者模型上有以下范围:
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()