2013-04-17 71 views
0

我有一個laravel模型雄辯模型關係恢復爲空

class Project extends Eloquent { 

    public static $timestamps = true; 

    public $includes = array('members','members.memberdata'); 

    public function tasks() { 

     return $this->has_many('Usertask','project_id'); 
    } 

    public function members() { 

     return $this->has_many('Projectmember','project_id'); 
    } 
} 

和相關模型

class Projectmember extends Eloquent { 

    public static $table = "project_members"; 
    public static $timestamps = true; 

    public function project() { 

     return $this->belongs_to('Project'); 
    } 

    public function memberdata() { 

     return $this->has_one('Usermetadata','user_id'); 
    } 
} 

class Usermetadata extends Eloquent { 

    public static $table = "users_metadata"; 

    public function user() { 

     return $this->belongs_to('User'); 
    } 

    public function member() { 

     return $this->belongs_to('Projectmember','user_id'); 
    } 
} 

當我嘗試檢索單個項目模型,像這樣

$project = Project::find($id); 

return Response::eloquent($project); 

我的json輸出看起來像這樣

{"id":1,"user_id":1,"name":"UberWork","description":"Web based project management \/ task management app","target_date":"2013-11-15 00:00:00","budget":null,"status":0,"created_at":"2013-04-16 20:13:59","updated_at":"2013-04-16 20:13:59","members":[{"id":1,"project_id":1,"user_id":1,"created_at":"2013-04-16 20:13:59","updated_at":"2013-04-16 20:13:59","memberdata":{"user_id":1,"first_name":"Tamarakuro","last_name":"Foh","photo":"","company_name":null,"phone":null,"package":"free","subscription_start":"0000-00-00 00:00:00","subscription_end":"0000-00-00 00:00:00","api_key":"12b14a7d3ca48c53bb5b1a88fa3eca3b"}},{"id":3,"project_id":1,"user_id":3,"created_at":"2013-04-16 20:13:59","updated_at":"2013-04-16 20:13:59","memberdata":{"user_id":3,"first_name":"Ebere","last_name":"Uche","photo":"","company_name":"Chronotech Labs","phone":null,"package":"free","subscription_start":"0000-00-00 00:00:00","subscription_end":"0000-00-00 00:00:00","api_key":"ab446bd9ffbb898e818a892c7401e0f6"}},{"id":4,"project_id":1,"user_id":2,"created_at":"2013-04-17 08:13:00","updated_at":"2013-04-17 08:13:00","memberdata":null}]} 

我的數據庫是這樣的;

用戶

  • ID
  • 電子郵件
  • 密碼
  • IP_ADDRESS
  • 活躍
  • ...

users_metadata

  • ID
  • USER_ID
  • FIRST_NAME
  • 姓氏
  • profile_photo
  • ...

項目

  • ID
  • user_id說明
  • 描述
  • 狀態
  • ...

project_members

  • ID
  • PROJECT_ID
  • user_id

我的問題是爲什麼項目的最後一個成員的memberdata爲「null」,而其他成員不爲null。難道我做錯了什麼?

+1

您確定您的memberdata表中最後一位成員有匹配的記錄嗎?你的最後一個成員的'id'和'user_id'不匹配,我不知道這是否有意義,但是這個關係會匹配'id'到另一個表的'user_id'? –

+0

是的users_metadata表中有匹配的記錄 – MrFoh

+0

您可以更詳細地解釋一下數據庫設計嗎? 'user_id'到處都指什麼? –

回答

0

Eloquent中的關係總是將主鍵(pk)與外鍵(fk)鏈接起來。但是,您試圖將關係建立在兩個外鍵之上,忽略了一段關係。唯一的雄辯解決方案是包含額外的關係步驟。這裏有一些模型(我忽略了這個例子中不需要的關係)...

class Project extends Eloquent { 

    public static $timestamps = true; 

    public $includes = array('members','members.user', 'members.user.metadata'); 

    public function members() 
    { 
     return $this->has_many('Projectmember','project_id'); 
    } 
} 

class Projectmember extends Eloquent { 

    public static $table = "project_members"; 
    public static $timestamps = true; 

    public function user() 
    { 
     return $this->belongs_to('User'); 
    } 
} 

class User extends Eloquent { 

    public static $timestamps = true; 

    public $hidden = array('password', 'ip_address'); 

    public function metadata() 
    { 
     return $this->has_one('Usermetadata'); 
    } 

} 

class Usermetadata extends Eloquent { 

    public static $table = "users_metadata"; 

    public function user() { 

     return $this->belongs_to('User'); 
    } 

} 

我可以看到爲什麼你想跳過這種關係,但遺憾的是這種關係是不可能的。

+0

非常感謝Phill – MrFoh