Laravel Eloquent Вложенные отношения возвращают данные только по первому элементу

Введение

Im havning на какой-нибудь трубе, получающей данные по всем связанным элементам. Я использую Laravel в качестве службы back-up REST, выставляя Json для внешнего приложения javascript.

Структура данных

У меня есть следующие таблицы:

+----------------+ +----------------+ +-------------+
|topics          | |posts           | |users        |
+----------------+ +----------------+ +-------------+
|id: int         | |id: int         | |id: int      |
|title: varchar  | |content: varchar| |name: varchar|
|content: varchar| |user_id: int    | +-------------+
|user_id: int    | |topic_id: int   |
+----------------+ +----------------+ 

Тема имеет от 0 до многих сообщений, и у нее есть автор (пользователь)

У сообщения есть один автор (пользователь)

UML: http://i58.servimg.com/u/f58/11/26/57/95/intrep10.png

Модели Laravel

class User extends Eloquent {
    protected $table = 'users';

    public function topics() {
        reutrn $this->hasMany('Topic');
    }

    public function posts() {
        reutrn $this->hasMany('Post');
    }
}

class Topic extends Eloquent {
    protected $table = 'topics';

    public function posts() {
            return $this->hasMany('Post');
    }

    public function author() {
         return $this->hasOne('User', 'id');
    }
}

class Post extends Eloquent {
    protected $table = 'posts';

    public function topic() {
        return $this->belongsTo('Topic');
    }

    public function author() {
        return $this->hasOne('User', 'id');
    }
}

контроллер

return Topic::where('id', '=', $topicId)
    ->with('author', 'posts.author')
    ->get();

Выход

[{
    id: 1,
    title: "My Topic",
    content: "With opinions about the darkside",
    user_id: 1,
    created_at: "2014-03-06",
    updated_at: "2014-03-06",
    author: {
        id: 1,
        name: "JamesBond",
        created_at: "2014-03-06",
        updated_at: "2014-03-06",
    },
    posts: [{
        id: 1,
        content: "Reply 1 on topic 1",
        user_id: 1,
        created_at: "2014-03-06",
        updated_at: "2014-03-06",
        author: {
            id: 1,
            name: "JamesBond",
            created_at: "2014-03-06",
            updated_at: "2014-03-06",
        },
    },
    {
        id: 2,
        content: "Reply 2 on topic 1",
        user_id: 1,
        created_at: "2014-03-06",
        updated_at: "2014-03-06",
        author: null,
    }]
}]

Вопрос

Как вы можете видеть jsoncode, оба сообщения создаются одним и тем же пользователем (с идентификатором 1), но только первый имеет объект author на нем. Любые указатели на то, как определить мою проблему, были бы идеальными.

Отказ

Это измененная версия моего проекта, так как я не хочу спамить вопрос с информацией. Если мне не хватает элементов serten на этот вопрос, я буду рад предоставить его.

Решение

Отображение моей модели отключено.

public function author() {
    return $this->belongsTo('User', 'user_id', 'id');
}

гарантирует, что его user_id будет искать в таблице сообщений, против столбца id в таблице users

SELECT * FROM users WHERE id = posts.user_id;

Ответ 1

В вашей модели Topic отношение для author должно быть

class Topic extends Eloquent {

    //...

    public function author() {
        return $this->belongsTo('User');
    }
}

То же самое относится к вашей модели Post:

class Post extends Eloquent {

    // ...

    public function author() {
        return $this->belongsTo('User');
    }
}

Это потому, что в обеих таблицах topics и posts у вас есть user_id, а user_id относится к таблице users, поэтому подумайте об этом, каждый user_id в своем topics и Таблица posts принадлежит таблице user, где соответствующее поле id в таблице users. В этом случае таблицы topics и posts являются дочерними элементами таблицы users.

Ответ 2

Я думаю, вы смешиваете свои отношения. Если это не так:

A Post принадлежит a User

A Post принадлежит a Topic

A User имеет много Post

A Topic имеет много Post

Поля таблицы

Пользователи: id, name

Сообщения: id, user_id, topic_id, content

Тема: id, title, content

Модели

class User extends Eloquent {
    protected $table = 'users';

    public function posts() {
        reutrn $this->hasMany('Post');
    }
}

class Topic extends Eloquent {
    protected $table = 'topics';

    public function posts() {
        return $this->hasMany('Post');
    }

}

class Post extends Eloquent {
    protected $table = 'posts';

    public function topic() {
        return $this->belongsTo('Topic');
    }

    public function author() {
        return $this->belongsTo('User', 'id');
    }
}

Получить сообщения с авторами и темой:

return Post::where('topic_id', '>=', $topicId)
    ->with('topic', 'author')
    ->get();