Laravel: красноречивые отношения от JSON - PullRequest
0 голосов
/ 13 апреля 2020

Все еще практикую в Laravel. В настоящее время у меня есть контроллер страницы, который находит все разделы, доступные для соответствующей страницы (простые HTML разделы), и включает их в блэйд следующим образом:

@foreach(@sections as @section)
  @include('sections.' . $section->filename)

Тогда у меня есть * Таблица 1004 * с данными для соответствующего раздела, а также столбец columns с данными JSON внутри, который выглядит следующим образом:

 {"header":"Section column 1", "text":"bruh?", "image_id":""},
 {"header":"Section column 2", "text":"bruh?", "image_id":""},
 {"header":"Section column 3", "text":"bruh?", "image_id":"7"}

Как видите, существует image_id, который должен вызвать имя файла из таблицы images, используя отношение Eloquent (я предполагаю, что это будет один ко многим).

Да, я знаю, что хранение JSON внутри таблицы - не лучшее решение (особенно если вы хотите кросс-запрос данных к нему), но это лучшее, что я придумал.

Итак, вопрос (ы): как я могу получить имя файла изображения, используя только идентификатор из JSON объекта или , есть ли другое решение, кроме JSON Таблица ?

PS columns и формат JSON используются для определения некоторых свойств, так как некоторые из моих разделов имеют 3-9 текстовых столбцов (col-md-3), и каждый из них имеет другой заголовок, текст и изображение, поэтому я храню их внутри JSON.

PPS Мой JSON формат действителен, я просто удалил некоторое форматирование, чтобы этот вопрос был ясным.

1 Ответ

1 голос
/ 13 апреля 2020

Laravel не имеет встроенной поддержки JSON отношений.

Я создал пакет для этого: https://github.com/staudenmeir/eloquent-json-relations

class Section extends Model
{
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    protected $casts = [
       'columns' => 'json',
    ];

    public function image()
    {
        return $this->belongsTo(Image::class, 'columns->image_id');
    }
}

class Image extends Model
{
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    public function sections()
    {
       return $this->hasMany(Section::class, 'columns->image_id');
    }
}

{{ $section->image->filename }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...