Красноречивое модельное отношение возвращается как null

У меня есть модель 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
  • Эл. адрес
  • пароль
  • айпи адрес
  • активный
  • ...

users_metadata

  • id
  • ID пользователя
  • имя
  • фамилия
  • Аватар
  • ...

Проекты

  • id
  • ID пользователя
  • имя
  • описание
  • положение дел
  • ...

project_members

  • id
  • project_id
  • ID пользователя

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


person MrFoh    schedule 17.04.2013    source источник
comment
Вы уверены, что есть соответствующая запись для вашего последнего члена в таблице memberdata? id и user_id вашего последнего члена не совпадают, я не знаю, имеет ли это значение, но связь будет совпадать id с user_id другой таблицы?   -  person Phill Sparks    schedule 18.04.2013
comment
Да, в таблице users_metadata есть соответствующая запись   -  person MrFoh    schedule 18.04.2013
comment
Не могли бы вы подробнее рассказать о дизайне вашей базы данных? Что означает user_id везде?   -  person Phill Sparks    schedule 18.04.2013
comment
Я отредактировал свой вопрос, чтобы включить дизайн базы данных   -  person MrFoh    schedule 18.04.2013
comment
Проблема в том, что вы хотите project_members.user_id = users_metadata.user_id, но отношения всегда используют id одной таблицы и fk (user_id) в другой таблице. Это работает для большинства ваших данных, потому что project_members.id и project_members.user_id одинаковы; он ломается, когда их нет (ваш последний участник проекта).   -  person Phill Sparks    schedule 18.04.2013


Ответы (1)


Отношения в 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');
    }

}

Я понимаю, почему вы хотите пропустить отношения, но, к сожалению, в отношениях это невозможно.

person Phill Sparks    schedule 18.04.2013