Я создаю собственную систему шаблонов для своих новостных рассылок, в которую вы можете добавлять предварительно определенные блоки в новостную рассылку.Они будут храниться в виде сериализованного html в моей таблице Blocks.
Таким образом, в бюллетене может быть много блоков, а в блоке может быть много бюллетеней, поэтому здесь мы имеем отношение многих ко многим.(В одном блоке также есть определенное количество BlockItems)
Теперь я пытаюсь использовать сводную таблицу newsletters_blocks в качестве отдельной модели, чтобы установить другое отношение к этой сводной таблице.Так что я могу хранить содержимое в этой новой таблице.Таким образом, таблица blocks и blocks_items предопределена и останется без изменений, и в будущем будет легко добавлять новые.
Моя база данных выглядит так:
Мои модели выглядят так:
Модель информационного бюллетеня:
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
Но сейчас я пытаюсь связать блок с информационным бюллетенем, но я не уверен, как я могу это сделать.Если честно, я даже не уверен, возможно ли то, что я пытаюсь сделать здесь.