【问题标题】:How to define Laravel relationship when multiple columns are associated多列关联时如何定义Laravel关系
【发布时间】:2019-03-28 23:13:04
【问题描述】:

我有下面提到的模型, laravel eloquent-relationship 如何在其上实现?

用户模型

id
name

后模型

id
title
desc
created_by = foreign key on User->id

第一阶段(PostStageOneModel)

id
post_id
assigned_by
assigned_to

第二阶段(PostStageTwoModel)

post_id
assigned_by  = foreign key on User->id
assigned_to  = foreign key on User->id

第三阶段(PostStageThreeModel)

post_id
assigned_by  = foreign key on User->id
assigned_to  = foreign key on User->id

第四阶段(PostStageFourModel)

post_id
assigned_by  = foreign key on User->id
assigned_to  = foreign key on User->id

第五阶段(PostStageFiveModel)

post_id
assigned_by  = foreign key on User->id
assigned_to  = foreign key on User->id

第六阶段(PostStageSixModel)

post_id
assigned_by  = foreign key on User->id
assigned_to  = foreign key on User->id

【问题讨论】:

    标签: php laravel eloquent eloquent-relationship


    【解决方案1】:

    我通过定义以下关系来做到这一点

    在 PostStageOneModel 模型中

    public function assignedPost() {
        return $this->belongsTo(Post::class, 'post_id', 'post_id');
    }
    
    public function assigner()
    {
        return $this->belongsTo(User::class, 'assigned_by', 'id');
    }
    
    public function assignee()
    {
        return $this->belongsTo(User::class, 'assigned_to', 'id');
    }
    

    在后期模型中

    public function identifiedBy() {
        return $this->belongsTo(User::class, 'identified_by', 'id');
    }
    
    public function postAssignedBy() {
        return $this->hasManyThrough(User::class, PostStageOneModel::class, 'post_id', 'id', 'post_id', 'assigned_by' );
    }
    
    public function postAssignedTo() {
        return $this->hasManyThrough(User::class, PostStageOneModel::class, 'post_id', 'id', 'post_id', 'assigned_to' );
    }
    

    在用户模型中

    public function assigned()
    {
        return $this->hasMany(PostStageOneModel::class, 'assigned_by', 'id');
    }
    
    public function assignedTo()
    {
        return $this->hasMany(PostStageOneModel::class, 'assigned_to', 'id');
    }
    

    【讨论】:

      【解决方案2】:

      用户模型应该有一个hasMany 关系类型,如下所示:

      <?php
      namespace App;
      use Illuminate\Database\Eloquent\Model;
      class User extends Model {
          //...
          public function posts() {
              return $this->hasMany(Post::class);
          }
      }
      

      帖子通过 created_by 属性属于用户

      <?php
      namespace App;
      use Illuminate\Database\Eloquent\Model;
      class Post extends Model {
          //...
          public function createdBy() {
              return $this->belongsTo(User::class, 'created_by');
          }
      }
      

      PostStageOneModel 属于帖子和使用 2 个不同属性的用户

      <?php
      namespace App;
      use Illuminate\Database\Eloquent\Model;
      class PostStageOneModel extends Model {
          //...
          public function post() {
              return $this->belongsTo(Post::class);
          }
          public function assignedTo() {
              return $this->belongsTo(User::class, 'assigned_to');
          }
          public function assignedBy() {
              return $this->belongsTo(User::class, 'assigned_by');
          }
      }
      

      希望有帮助

      【讨论】:

      • 感谢您的努力。请看我的回答,如果我能改进的话,请告诉我。
      • 听起来正确 ` return $this->belongsTo(User::class, 'assigned_by', 'id');` 如果与用户有关系,您可以省略 'id'(这是默认设置)
      • 我特意提到了所有内容,以便将来使用它的每个人都更容易理解。谢谢。
      【解决方案3】:

      关系可以指定它们使用哪一列:

      public function assigner(){
          return $this->belongsTo(User::class, 'assigned_by');
      }
      public function assignee(){
          return $this->belongsTo(User::class, 'assigned_to');
      }
      

      【讨论】:

      • 您好 Jeff,非常感谢您的努力,对于分配者,我得到了正确的结果,但对于分配者,我得到了 null!
      • 感谢您的努力。请看我的回答,如果我能改进的话,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 2018-05-05
      • 2016-12-10
      • 1970-01-01
      • 2015-12-04
      • 2018-06-28
      • 2015-04-25
      相关资源
      最近更新 更多