Laravel hasManyThrough, но должен возвращать только один массив
У меня есть следующие таблицы:
Таблица записей
---------------------------------
| id | blog_id | title |
---------------------------------
| 1 | 1 | 1st Entry |
---------------------------------
Таблица блогов
-----------------
| id | name |
-----------------
| 1 | 1stBlog |
-----------------
Таблица групп полей
-------------------------
| id | blog_id | name |
-------------------------
| 1 | 1 | Group1 |
-------------------------
Таблица полей
---------------------------------
| id | field_group_id | name |
---------------------------------
| 1 | 1 | field_1 |
---------------------------------
Таблица значений
------------------------------------------
| id | field_id | entry_id | value |
------------------------------------------
| 1 | 1 | 1 | Hello World |
------------------------------------------
Теперь на моих моделях я установил эти отношения:
class Entry extends Model
{
public function blog()
{
return $this->belongsTo(Blog::class);
}
}
class Blog extends Model
{
public function entries()
{
return $this->hasMany(Entry::class);
}
public field_group()
{
return $this->hasOne(FieldGroup::class);
}
}
class FieldGroup extends Model
{
public function fields()
{
return $this->hasMany(Entry::class);
}
public function blog()
{
return $this->belongsTo(Blog::class);
}
}
class Field extends Model
{
public function group()
{
return $this->belongsTo(FieldGroup::class, 'field_group_id');
}
public function values()
{
// this method should get the values from the Values table per entry id
return $this->hasManyThrough(Value::class, Entry::class, 'id', 'entry_id');
}
}
class Value extends Model
{
public function field()
{
return $this->belongsTo(Field::class, 'field_id');
}
}
Используя этот запрос, я могу
$entry = Entry::with('blog.field_group.fields')->find(1)
Я могу получить запись вместе со своим блоком, полевыми группами и полями. Я хочу получить значения, связанные с этой записью,
$entry = Entry::with('blog.field_group.fields.values')->find(1)
У меня возникают проблемы с тем, какие отношения использовать. Буду признателен за любую оказанную помощь. Я только начал использовать laravel.
Ответы
Ответ 1
Попробуйте...
Заменить идентификатор по полю_ид:
return $this->hasManyThrough(Value::class, Entry::class, 'id', 'entry_id');
Вот так:
return $this->hasManyThrough(Value::class, Entry::class, 'field_id', 'entry_id');
Поскольку вы используете стандартные имена столбцов laravel, вы можете упростить еще больше:
return $this->hasManyThrough(Value::class, Entry::class);
Смотрите в: https://laravel.com/docs/5.1/eloquent-relationships#has-many-through
Ответ 2
Я думаю, вы должны использовать 'foreign_key' с 'hasMany' и 'hasOne'.
return $this- > hasMany ('Comment', 'foreign_key');
class Blog extends Model
{
public function entries()
{
return $this->hasMany(Entry::class, 'blog_id');
}
public field_group()
{
return $this->hasOne(FieldGroup::class, 'blog_id');
}
}
см
http://laravel.com/docs/4.2/eloquent#one-to-many