2015-10-08 2 views
1

Так что я следующий объем на модели Инвестор:Laravel дает мне возразить, когда он не должен

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) 

вернет 1, а затем в другое время после этого он вернется: Object of class Illuminate\Database\Eloquent\Builder could not be converted to int Если да, то: var_dump(is_object(Investor::countUsersInRegionForCompany($slug, $regionCode))) Его ложный один раз, затем верно для каждого другого его вызываемого.

Это единственный вопрос, который вызывает эту проблему. Как бы то ни было, если я делаю var dump внутри области, чтобы получить переменную $query вместо того, чтобы возвращать ее, как вы видите, что я делаю, она возвращается как 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 (Это фактически делает страницу ошибки Laravel HTML с этим сообщением)

Что происходит?

+0

Что произойдет, если вы сделаете '-> get() -> count();' вместо '-> count();'? – Jamesking56

+0

Точная же проблема @ Jamesking56 – TheWebs

ответ

5

Это из-за немного глупой проверки Ларавеля. Когда он называет сферу он проверяет, что функция должна возвращать и добавить запасной вариант для построения цепочки:

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

так, когда ваша функция возвращает 1 - тройная оператор равен истинным и результат возвращается, когда он вернется 0 - тройная оператор выходит из строя, и вместо этого вы получаете this.

Я советую вам не возвращать результат из сферы действия. Это делается для изменения запроса, а не для возврата результатов. Поместите счетчик() вне области, такой как

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

Хороший совет здесь: _ [Области] выполнены, чтобы изменить запрос, а не возвращать результаты_ – BrokenBinary

Смежные вопросы