Laravel 5.0 сохранить данные в сводной таблице, которая используется в качестве модели - PullRequest
1 голос
/ 09 мая 2019

Я создаю собственную систему шаблонов для своих новостных рассылок, в которую вы можете добавлять предварительно определенные блоки в новостную рассылку.Они будут храниться в виде сериализованного html в моей таблице Blocks.

Таким образом, в бюллетене может быть много блоков, а в блоке может быть много бюллетеней, поэтому здесь мы имеем отношение многих ко многим.(В одном блоке также есть определенное количество BlockItems)

Теперь я пытаюсь использовать сводную таблицу newsletters_blocks в качестве отдельной модели, чтобы установить другое отношение к этой сводной таблице.Так что я могу хранить содержимое в этой новой таблице.Таким образом, таблица blocks и blocks_items предопределена и останется без изменений, и в будущем будет легко добавлять новые.

Моя база данных выглядит так: relations

Мои модели выглядят так:

Модель информационного бюллетеня:

class Newsletter extends Model
{
    public function blocks()
    {
        return $this->belongsToMany('Block', 'blocks', 'newsletter_id', 'blocks_id')
            ->withPivot(
                'block_order',
                'block_item_content_id'
            )
            ->as('block_item_content')
            ->using(BlockNewsletterPivot::class);
    }
}

Модель блока:

class Block extends Model
{
    protected $table = 'blocks';

    protected $fillable = ['name', 'image_thumbnail', 'image', 'html'];

    public $timestamps = false;

    public function newsletter()
    {
        return $this->hasMany('App\Newsletter');
    }

    public function blockItems()
    {
        return $this->hasMany('App\BlockItem');
    }
}

Модель BlockItem:

class BlockItem extends Model
{
    protected $table = 'blocks_items';

    protected $fillable = ['block_id', 'item_type', 'html_key'];

    public $timestamps = false;

    public function block()
    {
        return $this->belongsTo('App\Block');
    }
}

Сводная таблица newsletters_blocks Модель

class NewsletterBlockPivot extends Pivot
{
    public function blockItemContent()
    {
        return $this->belongsTo(BlockItemContent::class);
    }
}

BlockItemContent Модель:

class BlockItemContent extends Model
{
    protected $table = 'block_item_content';

    protected $fillable = ['item_type', 'html_key', 'content', 'properties'];

    public $timestamps = false;
}

Теперь, если я хочу получить доступ к полю содержимого таблицы block_item_content, я могу сделать это следующим образом:

 $newsletter->newsletters_blocks->blockItemContent->content

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

1 Ответ

0 голосов
/ 09 мая 2019

Итак, вы пытаетесь получить доступ:

$newsletter->newsletters_blocks->blockItemContent->content

Давайте проанализируем это:

Первая часть

$newsletter->newsletters_blocks

В вашей Newsletter модели вы определили отношение многие ко многим с помощью таблицы blocks, используя функцию blocks() внутри функции:

$this->belongsToMany('Block', 'blocks', 'newsletter_id', 'blocks_id') должно быть примерно таким:

$this->belongsToMany(Block::class, ...everything else should be fine if correct...)

Итак, вы можете получить доступ ко многим блокам одного информационного бюллетеня, как показано ниже:

$newsletter->blocks

но не $newsletter->newsletters_blocks

Теперь, вторая часть

Давайте идти вперед: $newsletter->blocks->blockItemContent

Что это значит?если $newsletter->blocks означает много блоков, то как мы можем получить доступ к blockItemContent из множества блоков одновременно?вы должны сделать что-то вроде:

foreach($newsletter->blocks as $block){
  dump($block->blockItemContent->content);//here it is
}

Вот как это должно работать, если все ваши определяемые отношения верны, а все столбцы базы данных и внешние ключи верны.Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...