2016-08-15 2 views
0

У меня есть следующий кодEloquent Запрос возврата Scope Builder вместо модели при использовании PHPUnit

$user = User::findByAccountCode($transaction->account_code); 

Когда я выполняю этот код на PHPUnit он возвращает экземпляр Осветите \ Database \ красноречивый \ Builder вместо модели пользователя.

Вот код для findByAccountCode

public function scopeFindByAccountCode($query,$account_code){ 


    return $query->where('account_code', $account_code)->first(); 

} 

Я получаю следующее сообщение об ошибке на моей заявке

ErrorException: Аргумент 1 передается aunicaj \ Библиотеки \ MarkupRepository :: пользователь() должен быть экземпляр aunicaj \ Models \ User, экземпляр Illuminate \ Database \ Eloquent \ Builder , указанный

Когда я использую браузер, он работает нормально, но не на phpunit. Спасибо

ответ

1

Я получил решать проблемы оказывается, что мой метод фабрики в моем тесте используется

factory(User::class)->make() 

должно быть

factory(User::class)->create() 
1

Вы неправильно используете области запроса. Они никогда не должны брать какие-либо записи (это то, что делает ваш звонок до first()) - им разрешено обновлять запрос с помощью добавления/удаления ограничений.

Заменить

public function scopeFindByAccountCode($query,$account_code){ 
    return $query->where('account_code', $account_code)->first(); 
} 

с

public function scopeFindByAccountCode($query,$account_code){ 
    return $query->where('account_code', $account_code); 
} 

и использовать его везде, как следующее:

$user = User::findByAccountCode($transaction->account_code)->first(); 

Если вы хотите иметь метод в пользователя метод, который будет вернуть пользователя для данного кода учетной записи, не стесняйтесь создавать его, но не запускайте свое имя сферу, например:

public static function scopeFindByAccountCode($account_code){ 
    return static::where('account_code', $account_code)->first(); 
} 

Таким образом, ваш код будет работать, как вы хотите - звоните следующее, чтобы получить одного пользователя:

$user = User::findByAccountCode($transaction->account_code); 
+0

Я вижу, я обновлю свои коды, спасибо :) – iamkristher

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