Всегда стремитесь к соотношению нагрузки при использовании черты в красноречивой модели

Я предоставляю HasTranslation-Просто для любой из моих красноречивых моделей. Все модели, использующие эту черту, получат отношение «один ко многим», как это (где вы можете увидеть мои базовые отношения Model к ModelLanguages):

public function languages()
{
return $this->hasMany(get_class($this).'Lang', 'master_id', 'id');
}

Что я хочу сделать, это:

Всегда стремимся загрузить отношения hasOne с переводом языка текущего пользователя. Поэтому, когда пользователь входит в систему, мои модели должны иметь что-то вроде $model->userLanguage быть загруженным и имеет тип ModelLang,

Это выглядит так и прекрасно работает:

public function userLanguage()
{
$user = \Auth::user();

if (!$user)
{
throw new \Exception(__CLASS__.': userLanguage not available because there is no session');
}

return $this->hasOne(get_class($this).'Lang', 'master_id', 'id')->where('language_id', $user->language_id);
}

Я борюсь с возможностью автоматически загружать эти отношения для всех моделей, просто включив эту черту.

Что я пробовал до сих пор

  1. Используйте конструктор внутри черты: может работать, но не очень хорошая идея, потому что это может столкнуться с конструктором другой черты. По сути, я бы подтвердил утверждение: не используйте конструктор в любых чертах.

  2. Используйте метод boot-Trait (bootHasTranslation) но там у меня нет конкретного объекта для вызова load или же with метод на. Я не нашел никакой зацепки в инстанцированной красноречивой модели, где я хочу добавить свое отношение к активной нагрузке

Есть идеи? Есть что-то очевидное, что я здесь упустил?

3

Решение

Вы можете создать промежуточное программное обеспечение для авторизованного языка пользователя.

public function handle($request, Closure $next)
{

if (!Auth::check()) {
return redirect('/')->with('Success','You have successfully logged out');
}

$user = \Auth::user();

$language =  $user->languages()->where('language_id', $user->language_id);

$request->attributes->add([
'user_language' => $language
]);

$next($request);
}

Вы можете получить эти данные после промежуточного программного обеспечения, как

$request->attributes->get('user_language');
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]