2014-11-18 3 views
-2

У меня возникли проблемы с следующим фрагментом кода на моем контроллере:Призыва к неопределенным метод Осветите Database Eloquent Коллекция :: whereHas() в Laravel

$opportunity_date = $oppr_arr->opportunity_date; 
$locations_array_result = explode(",",$locations_array_result); 
$usersCount = User::where('activated', '=', 1) 
        ->where('group_id', '=', 1) 
        ->where('availability_date', '<=', $opportunity_date) 
        ->get(); 

foreach ($locations_array_result as $param) { 
    $usersCount = $usersCount->whereHas('desiredLocation', function ($q) use($param) { 
     $q->where('location_id', '=', $param); 
    }); 
} 

$usersCount = $usersCount->count(); 

Когда я запускаю его, он дает мне следующее сообщение об ошибке:

Call to undefined method Illuminate\Database\Eloquent\Collection::whereHas() 

Я мои отношения настроить так:

пользователя Модель

public function desiredLocation() { 
    return $this->belongsToMany('Location', 'user_desired_location'); 
} 

Расположение Модель

class Location extends \Eloquent { 
    protected $table = 'locations'; 
    protected $fillable = array('name'); 

    public function country() { 
     return $this->belongsTo('Country'); 
    } 
} 

А структура базы данных для user_desired_location таблицы:

- id 
- user_id 
- location_id 
+0

Выполняется запрос, когда вы вызываете метод get() 'QueryBuilder в вашем контроллере. Это означает, что '$ usersCount' имеет тип' Collection', что означает, в свою очередь, вы не можете называть 'whereHas' на нем (' whereHas' - метод QueryBuilder). Я не совсем понимаю, что вы пытаетесь сделать, но вам нужно изменить свой код :( – edpaez

+0

Возможный дубликат [Вызов функции-члена whereHas() для не-объекта в laravel] (http: // stackoverflow .com/вопросы/26994459/призыв к а-члена-функции-wherehas-на-не-объект-в-Laravel) – bcmcfc

ответ

2

Вы звоните get слишком рано, и это работает запрос, прежде чем вы хотели , Перемещение его после цикла foreach решает его:

$usersCount = User::where('activated', '=', 1) 
        ->where('group_id', '=', 1) 
        ->where('availability_date', '<=', $opportunity_date); 

foreach ($locations_array_result as $param) { 
    $usersCount = $usersCount->whereHas('desiredLocation', function($q) use($param){ 
     $q->where('location_id', '=', $param); 
    }); 
} 

$users = $usersCount->get(); 
$usersCount = $users->count(); 

Также обратите внимание: Если все вы заинтересованы в том, граф, и вы не будете использовать реальные пользователь, вам не нужно вызывать get, а затем count; это создает ненужную нагрузку, фактически выбирая всех пользователей и подсчитывая их на стороне PHP. Вместо этого используйте count напрямую, а Eloquent выдает запрос COUNT(), делая это на стороне базы данных. Вроде так:

$usersCount = $usersCount->count(); 
Смежные вопросы