当使用phpunit时,Eloquent Query Scope返回Builder而不是Model

时间:2016-08-15 07:43:31

标签: php laravel laravel-5 eloquent phpunit

我有以下代码

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

当我在phpunit上执行此代码时,它返回Illuminate \ Database \ Eloquent \ Builder的实例,而不是用户模型。

以下是findByAccountCode

的代码
public function scopeFindByAccountCode($query,$account_code){


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

}

我的应用程序出现以下错误

  

ErrorException:参数1传递给   aunicaj \ Libraries \ MarkupRepository :: user()必须是。的实例   aunicaj \ Models \ User,Illuminate \ Database \ Eloquent \ Builder的实例   给定

当我使用浏览器时,它的工作正常但不在phpunit上。谢谢

2 个答案:

答案 0 :(得分:3)

您未正确使用查询范围。他们永远不应该获取任何记录(这是您对 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);

答案 1 :(得分:1)

我得到问题解决结果是我的测试中的工厂方法正在使用

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

应该是

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