如何在Eloquent上设置条件关系

时间:2017-04-27 21:24:45

标签: laravel eloquent relationships

我有这个(简化的)表结构:

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');
    }    
}

我怎么能实现这样的目标?

3 个答案:

答案 0 :(得分:12)

让我们采取不同的方法来解决您的问题。首先分别设置各种模型的设置关系。

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();

这应该为您提供正确的个人资料。希望它有所帮助。

答案 1 :(得分:3)

您可以使用其他方法执行此操作,请检查:

  

博客帖子和视频模型可以与a共享多态关系   标签模型。使用多对多多态关系可以实现   有一个在博客帖子中共享的唯一标记列表   和视频。首先,让我们检查一下表格结构:

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

答案 2 :(得分:0)

看起来应该是$this->type而不是$this->$type - 因为type是属性,而不是变量。