Laravel BelongsTo和hasOne Model Relationship返回Null

时间:2015-11-26 11:44:13

标签: php eloquent laravel-5.1

我想知道为什么我的模型在数据库表中不存在请求的记录时返回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
}

请参阅:http://fractal.thephpleague.com/

2 个答案:

答案 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');
}

这应该可以解决问题。

您需要遍历用户以获取每个用户的状态。