Eloquent Eager正在加载$ append属性

时间:2017-06-03 18:25:54

标签: laravel laravel-5 eloquent

我有点坚持这个,不知道如何推进这个。

我有两个模型:用户孩子,他们处于关系

(请记住,这只能说明问题)

class Child extends Model{

    protected $primaryKey = 'id_child';

    public $appends = ['is_alive'];

    public function user(){

        return $this->belongsTo('Models\User','id_user');

    }

    public function getIsAliveAttribute(){

        if (!is_null($this->lifetime_updated_at))
            return (Carbon::parse($this->lifetime_updated_at)->addMinute($this->lifetime) >= Carbon::now());
        else
            return false;
    }
}

class User extends Model{

    protected $primaryKey = 'id_user';

    public $appends = ['is_alive'];

    public function childs(){

        return $this->hasMany('Models\Child','id_user');
}

public function getIsAliveAttribute(){

    if (!is_null($this->lifetime_updated_at))
        return (Carbon::parse($this->lifetime_updated_at)->addMinute($this->lifetime) >= Carbon::now());
    else
        return false;
}

}

现在我想在Controller中使用 Eager Loading 来从用户检索我的Childs数据。

但我的用户模型对象来自我的应用程序中的MiddleWare。所以我只使用用户模型对象,我不想再使用“with()”查询用户。

$user = User::where('name','DoctorWho')->first();

return user->childs()->find(3);

此操作返回的内容:

    {
        "id_child": 3,
        "name": "JayZ",
        "last_name": "Etc",
        "lifetime": 1,
        "lifetime_updated_at": null,
        "created_at": "2017-05-29 21:40:02",
        "updated_at": "2017-05-29 21:40:02",
        "active": 1   
}

我需要什么(附加属性)

{
    "id_child": 3,
    "name": "JayZ",
    "last_name": "Etc",
    "lifetime": 1,
    "lifetime_updated_at": null,
    "created_at": "2017-05-29 21:40:02",
    "updated_at": "2017-05-29 21:40:02",
    "active": 1,
    "is_alive": true
  }

甚至可以使用预先加载来检索具有附加属性的子数据?

注意:此用户对象来自中间件,我必须使用用户模型对象来获取其子项的附加属性。

先谢谢, LosLobos

2 个答案:

答案 0 :(得分:0)

你在这里做的不是急切的加载。您的childs关系错了。应基于模型和定义的其他关系return $this->hasMany('Models\Child', 'id_user');

以下是一些可以访问子信息的方法。默认情况下,这些应该尊重$appends属性并加载字段。

$childId = 3;

$user = User::with('childs')
    ->where('name', 'DoctorWho')
    ->first();

return $user->childs()->where('id_child', $childId)->first();

// Or

$user = User::with(['childs' => function ($query) use ($childId) {
        $query->where('id_child', $childId);
    }])
    ->where('name', 'DoctorWho')
    ->first();

return $user->childs->first();

// Or

$child = Child::whereHas('user', function ($query) {
        $query->where('name', 'DoctorWho');
    })
    ->find(3);

return $child;

编辑:

如果您已拥有用户模型,则可以执行此操作。

$child = Child::where('id_user', $user->id_user)
    ->where('id_child', 3)
    ->first();

return $child;

答案 1 :(得分:0)

问题是我做错了什么与Eloquent无关,因为附带的属性附带了这个模型!