Laravel 5.5 фиксированное количество hasMany связей

253
10 ноября 2017, 10:26

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

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? Ведь при создании новости или если в будущем добавится язык - связи будут пусты. За любые комментарии, по теме или исправлению качества кода - буду благодарен.

READ ALSO
Как создать динамический файл с помощью PHP?

Как создать динамический файл с помощью PHP?

Помогите, пожалуйста, разобраться с задачейЕсть файл в котором, например, 5 строк

196
не понятное условие

не понятное условие

Есть такой код и я не понимаю, что он делает, но он магическим образом выводит карусель с даннымиЗаказчик прислал мне правки в которых надо,...

246
PhpStorm - настройка php в интегрированном ubuntu в win10

PhpStorm - настройка php в интегрированном ubuntu в win10

Включил интегрированную Ubuntu в Win10, установил LAMP-стек, но столкнулся с проблемой - я не знаю как в шторм добавить интерпретатор PHP, установленный...

259
Laravel routing regex

Laravel routing regex

Имеется такой роут, но регулярка для hash не срабатывает на хэшВ чем проблема?

180