使用 phpunit 时,雄辩的查询范围返回构建器而不是模型

iam*_*her 4 php phpunit laravel eloquent laravel-5

我有以下代码

$user = User::findByAccountCode($transaction->account_code);
Run Code Online (Sandbox Code Playgroud)

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

这是 findByAccountCode 的代码

public function scopeFindByAccountCode($query,$account_code){


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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

jed*_*ylo 7

错误地使用了查询范围。他们永远不应该获取任何记录(这就是您对first() 的调用正在执行的操作)——他们只能通过添加/删除约束来更新查询。

代替

public function scopeFindByAccountCode($query,$account_code){
  return $query->where('account_code', $account_code)->first();
}
Run Code Online (Sandbox Code Playgroud)

public function scopeFindByAccountCode($query,$account_code){
  return $query->where('account_code', $account_code);
}
Run Code Online (Sandbox Code Playgroud)

并在任何地方使用它,如下所示:

$user = User::findByAccountCode($transaction->account_code)->first();
Run Code Online (Sandbox Code Playgroud)

如果你想在你的User方法中有一个方法来返回给定帐户代码的用户,请随意创建它,但不要以scope开头,例如:

public static function findByAccountCode($account_code){
  return static::where('account_code', $account_code)->first();
}
Run Code Online (Sandbox Code Playgroud)

这样,您的代码将按您的意愿工作 - 调用以下命令以获取单个用户:

$user = User::findByAccountCode($transaction->account_code);
Run Code Online (Sandbox Code Playgroud)