Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.03.2018 14:22:41

Как создать подобное отношение?

Всем привет.
У меня на сайте есть следующие сущности:

Page — Страница, например "контакты"
id, name

К странице подключается Block, через отношение belongsToMany('App\Block')
Block - Блок, например "seo"
id, name

К блоку подключаются поля, через hasMany('\App\Field');
Field - Поле, например "keywords" и "description",
id, block_id, name

Один блок может подключатся к разным страницам и при этом в него должны подгружаться разные данные.
Для этого я хочу сделать еще одну сущность Data, в которой будут хранится данные полей блоков:
field_id, page_id, value

Выбрать страницу я пытаюсь примерно следующим запросом:
$data = Page::with('blocks.fields')->find(42);
Но при этом я не понимаю как создать отношение для подгрузки данных.
Что-бы их выбрать нужно поставить два условия: id поля и id страницы

Подскажите, какое отношение можно применить, что бы создать такую выборку?
Спасибо!

Не в сети

#2 22.03.2018 14:35:18

Re: Как создать подобное отношение?

Попробую переформулировать вопрос:

Есть следующие модели:

class Page extends Model {
    protected $with = ['blocks'];

    public function blocks() {
        return $this->belongsToMany('App\Block');
    }
}
class Block extends Model {
    protected $with = ['fields'];

    public function fields() {
        return $this->hasMany('App\Fields');
    }
}
class Field extends Model {
    protected $with = ['data'];

    public function data() {
        return $this->hasOne('\App\Data');
    }
}

И есть контроллер в котором я выбираю данные:

public function get() {
    $page_id = 1;
    $data = Page::find($page_id);
}

В результате получаю такую структуру:

Страница
    - Блок 1
        - Поле 1
            - Тестовые данные
        - Поле 2
            - Еще данные
    - Блок 2
        - Поле 1
            - Другие данные

Блок может принадлежать нескольким страницам.
Конкретное поле принадлежит конкретному блоку.
А вот данные, хранящиеся в этом поле должны быть привязаны к полю и к странице одновременно.

То есть мне нужо передать в функцию data() модели Field переменную $page_id

Что бы в результате получилось примерно так:

public function data() {
    return $this->hasOne('\App\Data')->where('page_id', '=', $page_id);
}

Не в сети

Подвал раздела