PHP雄辩的Orm将一个表中的多个列连接到另一个表

时间:2018-10-01 08:49:15

标签: php laravel orm eloquent

比方说,我有一个表Projects,其中在一个特定的元组中,我有许多用户。例如:

Projects

id    project_name    developer    manager    tester
1          w             ww           z          t
2          qq            y          ll         mm
...

现在,开发人员,经理和测试人员是“用户”表中的用户。 项目表包含用户的用户名。 说用户表就像

Users
    id    username    first_name    last_name    email_add
     1        ww         John         Smith       js@gmail.com
   ...

我想显示有关该项目的信息,但我需要所有用户的全名(first_name +“” + last_name),而不是存储在Projects表中的用户名。

什么是解决此问题的有效方法?

1 个答案:

答案 0 :(得分:1)

使用orm关系 (请参阅https://laravel.com/docs/5.7/eloquent-relationships#defining-relationships

和全名访问者。 (请参阅https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor

例如 在项目模型中

class Project extends Model {
.....
     # set relation
     public function developer() {
          return $this->hasOne('App\User', 'developer', 'username');
     }
     public function manager() {
          return $this->hasOne('App\User', 'manager', 'username');
     }
     public function tester() {
          return $this->hasOne('App\User', 'tester', 'username');
     }
.....
}

在用户模型中

class User extends Authenticatable implements Member {
      .....
      # set relation
      public function project() {
           return $this->belongsTo('App\Project', 'user_id');
      }
      .....
      public function getFullNameAttribute(): string {
            if(!$this->cache_full_name) {
                 $this->cache_full_name = $this->first_name . ' ' . $this->last_name;
            }
            return $this->cache_full_name;
      }
      ......
 }

使用中

$project = App\Project::query()->first();
echo $project->developer->full_name;
echo $project->manager->full_name;
echo $project->tester->full_name;