我想知道为什么我的模型在数据库表中不存在请求的记录时返回null,而不是返回空集合或空模型实例。
以下是我的模特
class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
protected $softDelete = true;
protected $fillable = [
'id',
'email',
'password',
'first_name',
'last_name',
'state_id'
];
public function state()
{
return $this->belongsTo('App\Models\State','state_id','id');
}
}
class State extends Model
{
protected $fillable = [
'name',
'country_id',
'active'];
}
州表
id name country_id active
1 texas 1 1
2 alaska 1 1
用户表
id first_name state_id
1 frank null
这是问题还是这个问题的表现方式?
$user = User::with('state')->get(); //returns null
$user->state->name; //surely throws an exception
//I don't want to do this or MUST I?:
if (is_object($user))
$state = $user->state->name;
我希望Laravel在状态表中不存在用户的state_id
时返回空集合,而不是返回null,
我遇到的问题是,我使用的Transformer需要一个state model
而不是null的实例
public function includeState(User $model)
{
$state = $model->state; //null is being returned here
return $this->item($state, new StateTransformer); //this throws an exception when it receives null
}
答案 0 :(得分:0)
您可以随时执行此操作:
if(!$state = $model->state) {
$state = new State();
}
或者,这可能有效
$state = ($model->state != null ? $model->state : new State());
如果您只是获得一位用户,则不需要急切加载with()
。
只是做:
$user = User::find($id);
$user->state->name
当您执行$user = User::with('state')->get();
时,您将获得所有用户的集合。所以$user->state
无法运作。
答案 1 :(得分:0)
Laravel有时会返回null $user = User::with('state')->get();
,因为在使用belongsTo时无需指定键,除非与id不同。所以来自:
public function state()
{
return $this->belongsTo('App\Models\State','state_id','id');
}
要:
public function state()
{
return $this->belongsTo('App\Models\State');
}
这应该可以解决问题。
您需要遍历用户以获取每个用户的状态。