私はこの(単純化された)テーブル構造を持っています:
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');
}
}
どうすればそのようなことを達成できますか?
問題を解決するために別のアプローチをとりましょう。まず、さまざまなモデルの関係をそれぞれ設定します。
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();
これにより、適切なプロファイルが得られます。それが役に立てば幸い。
別の方法でこれを行うことができますこれを確認してください:
ブログの投稿およびビデオモデルは、タグモデルとの多態的な関係を共有できます。多対多の多相関係を使用すると、ブログの投稿や動画全体で共有される一意のタグの単一のリストを作成できます。まず、テーブル構造を調べてみましょう。
https://laravel.com/docs/5.4/eloquent-relationships#many-to-many-polymorphic-relations
$this->type
のではなく $this->$type
-type
はプロパティではなく、変数なので。