2013-04-17 4 views
0

У меня есть модель LaravelEloquent отношения модели возвращение в нуле

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
  • last_name
  • profile_photo
  • ...

Проекты

  • ID
  • user_id
  • имя
  • описание
  • Статус
  • ...

project_members

  • ID
  • PROJECT_ID
  • user_id

Мой вопрос: почему последний член проекта имеет свои членские данные как «null», а остальные не являются нулевыми. Я делаю что-то неправильно?

+1

Вы уверены, что есть соответствующая запись для вашего последнего члена в таблице memberdata? «Id» и «user_id» вашего последнего члена не совпадают, я не знаю, является ли это значительным, но отношение будет соответствовать «id» в «user_id» другой таблицы? –

+0

Да, есть соответствующая запись в таблице users_metadata – MrFoh

+0

Можете ли вы объяснить немного больше о вашем дизайне базы данных? Что означает 'user_id' везде? –

ответ

0

Отношения в Eloquent всегда связывают первичный ключ (pk) с внешним ключом (fk). Однако вы пытаетесь установить отношения на двух внешних ключах, пропуская отношения. Единственное решение Eloquent заключается в том, чтобы включить дополнительный шаг отношений. Вот некоторые модели (я обошел отношения, которые нам не нужны для этого примера) ...

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