2017-06-03 90 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