3

私はHasTranslation雄弁なモデルに -Trait を提供しています。この特性を使用するすべてのモデルは、次のような 1 対多の関係を受け取ります (ここで、私の基本的な 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を実行する具体的なオブジェクトがありません。インスタンス化された雄弁なモデルへのフックが見つかりませんでした。ここで、リレーションを熱心なロードに追加しますloadwith

何か案は?私がここで見落としている明らかなものはありますか?

4

1 に答える 1