2017-06-03 121 views
1

我有点卡在这里,不知道如何前进与这一个。

我有两个型号:用户孩子,他们是在关系

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

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; 
} 

}

现在我想用预先加载在控制器中检索用户,我孩子的数据。

但我的用户模型对象来自我的应用程序中的中间件。所以我只有User Model Object才能使用,我不想再用“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 
    } 

甚至可以检索子数据与附加属性使用Eager加载?

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

由于事先 LosLobos

回答

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; 
+0

我拼错了关系,我编辑了原始问题。 –

+0

事情是我已经有一个用户模型对象,我不能使用“与”我只能使用用户模型来访问它的孩子。 –

+0

@IgorMorse然后您可以在现有模型上使用'load()'而不是'with()'来懒惰地加载关系。还有'$ user-> childs() - > where('id_child',$ childId) - > first();''即使您没有急切加载关系,这也可以正常工作。急切加载只是防止N + 1查询问题。在这种情况下,它不会有任何区别。 – Sandeesh