@tester_toster

Как в Laravel 5.5 правильно получить фиксированное количество hasMany связей?

Приветствую. Реализую мультиязычный функционал новостей на сайте. Есть таблицы:

languages
--id
--iso_code
--name

news
--id
--alias
--published

news_languages
--id
--news_id
--language_id
....


В модели news добавил:

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

public function getLanguage($id)
{
   if(!$this->languageBug){
      $this->languageBug = $this->newsLanguages->keyBy('language_id');
   }
   return $this->languageBug->get($id) ? $this->languageBug->get($id):  new NewsLanguage;
}

public function attachRequest($request)
{
    $lng = [];
    foreach(\App::make('Language')->getAll() as $language)
    {
        $l = $this->getLanguage($language->id);
        $l->language_id = $language->id;
        $l->title = $request->has('title.'.$language->iso_code) ? $request->title[$language->iso_code] : '';
        $l->meta_title = $request->has('meta_title.'.$language->iso_code) ? $request->meta_title[$language->iso_code] : '';
        $l->meta_description = $request->has('meta_description.'.$language->iso_code) ? $request->meta_description[$language->iso_code] : '';
        $l->content = $request->has('content.'.$language->iso_code) ? $request->content[$language->iso_code] : '';
        $lng[] = $l;
    }

    $this->alias = $request->alias;
    $this->published = $request->published;
    $this->save();
    $this->newsLanguages()->saveMany($lng);

}


Работа с моделью происходит через метод Route::resourse(...) На обновление и создание новости - один шаблон, один валидатор:

public function create(News $news, NewsRequest $request)
{
   $news->attachRequest($request);
}

public function update(News $news, NewsRequest $request)
{
   $news->attachRequest($request);
}


Форма отображается через laravel form collective:

{!! Form::model($news, ['route' => [ $news->id ? 'admin.news.update' : 'admin.news.store', $news], 'method' => $news->id ? 'PUT' : 'POST',  'files' => true]) !!}

...
{!!Form::label('alias', 'Алиас')!!}
{!!Form::text('alias', $news->alias, ['class' => 'form-control'])!!}
@if ($errors->has('alias'))
<span class="help-block">{{ $errors->first('alias') }}</span>
@endif
...
@foreach ($languages as $language)
...
<?php $lang = $news->getLanguage($language->id);?>
{!!Form::label('title'.$language->iso_code.'', 'Заголовок')!!}
{!!Form::text('title['.$language->iso_code.']', $lang->title, ['class' => 'form-control'])!!}
...
@endforeach
{!!Form::submit( $news->id ? 'Обновить' :'Создать',['class'  => 'btn btn-primary'])!!}
...


Все работает. Но решение как по мне - костыльное. Возможно ли как-нибудь правильнее получать пустые модели newsLanguages добавив в связи таблицу languages? Ведь при создании новости или если в будущем добавится язык - связи будут пусты. За любые комментарии, по теме или исправлению качества кода - буду благодарен.
  • Вопрос задан
  • 280 просмотров
Пригласить эксперта
Ответы на вопрос 1
neuotq
@neuotq
Прокрастинация
Попробуй перейти на spatie/laravel-translatable, у них решены многие проблемы, гораздо чище и прозрачнее код получается при создании мультиязычных штук.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы