首页 文章

来自hasMany关系的Laravel渴望加载模型

提问于
浏览
3

有3个表:

users :id,name

compliments :id,name

users_compliments :id,compliment_id,user_id,complimentor_id

这是我的用户模型:

class User extends Model
    public function sent_compliments()  {  
        return 
            $this->belongsToMany(
            'Compliment', 
            'users_compliments', 
            'complimentor_id',
            'compliment_id'
         )->withPivot('user_id');
}

这是一个示例响应,如果我运行 $user->sent_compliments()->get()

Illuminate\Database\Eloquent\Collection {
     all: [
       Compliment {
         id: 2,
         name: "You are smart",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 6,
           id: 99,
         },
       },
       Compliment {
         id: 52,
         name: "You are funny",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 42,
           id: 186,
         },
       },
     ],
   }

但这是我想要的响应(它包括实际的用户模型,而不仅仅是数据透视中的user_id)

Illuminate\Database\Eloquent\Collection {
     all: [
       Compliment {
         id: 2,
         name: "You are smart",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 6,
           id: 99,
         },
         user {
             id: 6,
             name: "John"
         }
       },
       Compliment {
         id: 52,
         name: "You are funny",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 42,
           id: 186,
         },
           user {
             id: 42,
             name: "Alex"
         }
       },
     ],
   }

有没有办法用雄辩的急切负载(比如使用 With:: 命令)来获取这些数据,而不是通过数据透视迭代,收集user_ids并手动查询 User 表?

1 回答

  • 2

    您需要定义 pivot 类并将关系 belongsTo 添加到user_id的pivot模型

    User Model

    public function sent_compliments()  {  
        return 
            $this->belongsToMany(
            'Compliment', 
            'users_compliments', 
            'complimentor_id',
            'compliment_id'
         )->withPivot('user_id')->using('App\UserComplement');
    }
    

    Pivot model 使用Illuminate \ Database \ Eloquent \ Relations \ Pivot;

    class UserComplement extends Pivot {
        protected $table = 'users_compliments';
    
        public function user(){
            return $this->belongsTo('App\User', 'user_id');
        }
    }
    

    Feth data

    //if you have user instance already then
    $complements = $user->sent_compliments;
    
    //if you don't have fetched user yet then try this 
    $user = User::with('sent_compliments')->find($userId);
    $complements = $user->sent_compliments;
    
    foreach($complements as $complement){
        dd($complement);
        dd($complement->pivot->user);
    }
    

    有关详细信息,请查看 Defining Custom Intermediate Table Models https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

    EDIT

    正如@JonasStaudenmeir指出的那样,没有办法急切加载 pivot user 关系 . 这是另一种解决方案

    User Model

    public function sent_compliments()  {  
        return $this->hasMany(UserCompliment::class , 'complimentor_id');
    }
    

    UserComplement model

    class UserComplement extends Model {
        $table = 'users_compliments';
    
        public function complimentor()  {  
            return $this->belongsTo(User::class , 'complimentor_id');
        }
    
        public function complement()  {  
            return $this->belongsTo(Compliment::class , 'compliment_id');
        }
    
        public function user()  {  
            return $this->belongsTo(User::class , 'user_id');
        }
    }
    

    Fetch Data

    $user = User::with('sent_compliments','sent_compliments.complement', 'sent_compliments.user')->find($userId);
    $sentComplements = $user->sent_compliments;
    
    foreach($sentComplements as $sentComplement){
        dd($sentComplement->complement);
        dd($sentComplement->user);
    }
    

    希望它可以清除你

相关问题