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