簡體   English   中英

來自hasMany關系的Laravel渴望加載模型

[英]Laravel eager load model from a hasMany relationship

有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表?

您需要定義pivot類並將關系belongsTo添加到user_id的pivot模型

用戶模型

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

Pivot模型使用Illuminate \\ Database \\ Eloquent \\ Relations \\ Pivot;

class UserComplement extends Pivot {
    protected $table = 'users_compliments';

    public function user(){
        return $this->belongsTo('App\User', 'user_id');
    }
}

Feth數據

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

有關詳細信息,請查看此定義自定義中間表模型 https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

編輯

正如@JonasStaudenmeir指出的那樣,沒有辦法急於加載pivot user關系。 這是另一種解決方案

用戶模型

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

UserComplement模型

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

獲取數據

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

希望它可以清除你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM