【问题标题】:Laravel Define foreign key in relationship according to column valueLaravel 根据列值定义关系中的外键
【发布时间】:2019-09-14 18:23:03
【问题描述】:

我在我的活动模式中有这些关系

public function invited()
    {
        return $this->belongsTo('App\Models\User', 'invitee');
    }

        public function senter()
    {
        return $this->belongsTo('App\Models\User', 'invitor');
    }

表将有字段“inviteeinvitororganiser”。我的要求是有一个方法 users() ,如果 "organiser" != "invitee"否则外键应该是invitor

提前致谢!!!

【问题讨论】:

    标签: laravel eager-loading


    【解决方案1】:

    谢谢@Augusto Moura,但我找到了另一种解决方案,它实际上不是最好的,但对我有用,这样我可以从事件模型中调用用户,也可以作为嵌套关系调用用户。

        public function users()
    {
        return $this->hasMany('App\Models\Invitation', 'round_id')
            ->select('users.*', 'round_invitations.round_id', 'round_invitations.accept_status', 'round_invitations.reservation', 'round_invitations.id as request_id', 'users.id as user_id')
            ->join('users', function ($join) {
                $join->on('users.id', '=', 'round_invitations.invitee')->whereColumn('users.id', 'round_invitations.invitee');
                $join->orOn('users.id', '=', 'round_invitations.invitor')->whereColumn('users.id', 'round_invitations.invitor');
    
            })->where(function ($query) {
            $query->where('accept_status', 1)->orWhere('reservation', 1);
        })->where('accept_status', '!=', 2)
            ->groupBy('round_invitations.id')
            ->whereColumn('users.id', '!=', 'organiser_id')
            ->groupBy('user_id')
            ->distinct('users.id');
    }
    
    Usage example: Event::with('user')->find(2);
    Another example: Organiser::with('Events.user')->find(2);
    

    【讨论】:

      【解决方案2】:

      由于您寻求的这个user() 是从其他关系派生的,因此将其设为普通方法(而不是关系)或属性可能是个好主意。

      普通方法方法

      public function user(){
          if($this->organiser->id == $this->invited->id){
              return $this->invited;
          }
          else{
              return $this->senter;
          }
      }
      

      使用示例:Event::with('organizer', 'invited', 'senter')->find(2)->user();

      属性方法

      public function getUserAttribute(){
          if($this->organiser->id == $this->invited->id){
              return $this->invited;
          }
          else{
              return $this->senter;
          }
      }
      

      使用示例:Event::with('organizer', 'invited', 'senter')->find(2)->user;

      【讨论】:

      • 抱歉,这种方法对我不起作用,因为我希望调用用户作为嵌套关系
      猜你喜欢
      • 2021-12-12
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2021-04-04
      • 2016-11-10
      相关资源
      最近更新 更多