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();