我有以下代码
$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上。谢谢
答案 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()