web-dev-qa-db-ja.com

Eloquentで条件付き関係をセットアップする方法

私はこの(単純化された)テーブル構造を持っています:

users
- id
- type (institutions or agents)

institutions_profile
- id
- user_id
- name

agents_profile
- id
- user_id
- name

そして、profileモデルにUsers関係を作成する必要がありますが、以下は機能しません。

class User extends Model
{
    public function profile()
    {
        if ($this->$type === 'agents')
            return $this->hasOne('AgentProfile');
        else
            return $this->hasOne('InstitutionProfile');
    }    
}

どうすればそのようなことを達成できますか?

11
Ju Nogueira

問題を解決するために別のアプローチをとりましょう。まず、さまざまなモデルの関係をそれぞれ設定します。

class User extends Model
{
    public function agentProfile()
    {
        return $this->hasOne(AgentProfile::class);
    }    

    public function institutionProfile()
    {
        return $this->hasOne(InstitutionProfile::class);
    }

    public function schoolProfile()
    {
        return $this->hasOne(SchoolProfile::class);
    }

    public function academyProfile()
    {
        return $this->hasOne(AcademyProfile::class);
    }

    // create scope to select the profile that you want
    // you can even pass the type as a second argument to the 
    // scope if you want
    public function scopeProfile($query)
    {
        return $query
              ->when($this->type === 'agents',function($q){
                  return $q->with('agentProfile');
             })
             ->when($this->type === 'school',function($q){
                  return $q->with('schoolProfile');
             })
             ->when($this->type === 'academy',function($q){
                  return $q->with('academyProfile');
             },function($q){
                 return $q->with('institutionProfile');
             });
    }
}

今、あなたはこのようにあなたのプロフィールにアクセスできます

User::profile()->first();

これにより、適切なプロファイルが得られます。それが役に立てば幸い。

14
oseintow

別の方法でこれを行うことができますこれを確認してください:

ブログの投稿およびビデオモデルは、タグモデルとの多態的な関係を共有できます。多対多の多相関係を使用すると、ブログの投稿や動画全体で共有される一意のタグの単一のリストを作成できます。まず、テーブル構造を調べてみましょう。

https://laravel.com/docs/5.4/eloquent-relationships#many-to-many-polymorphic-relations

3
Mortada Jafar

$this->type のではなく $this->$type-typeはプロパティではなく、変数なので。

0
Joel Hinz