环境
laravel 版本 5.5
1.问题
执行程序,报错:
Type error: Argument 1 passed to App\Services\TestService::score()
must be an instance of Illuminate\Support\Collection, null given, called in
/project/test.com/app/Http/Controllers/Api/Al/V1/TestController.php on
line 156
2. 代码
数据表
user
score
关联关系
// App\Models\User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;
class User extends Model
{
protected $table = 'user';
public function score()
{
return $this->belongsTo(Score::class, 'id', 'user_id');
}
...
}
使用
$users = User::where('class', 1')->with('socre')->get();
list = $users->map(function($item)){
$level = $this->test_service->checkScore($item->score);
...
}
# 下面这行报错
public function checkScore(Score $score)
{
$level = 0;
...
return $$level;
}
3. 分析原因
user关联的score记录不存在时,
$item->score 返回了NULL , 但checkScore()
要求参数必须为Score的实例
怎么才能返回一个空的score 实例呢?
4. 解决
belongsTo() 使用 withDefault()
// App\Models\User.php
public function score()
{
public function score()
{
return $this->belongsTo(Score::class, 'id', 'user_id')->withDefault();
}
问题解决啦!