[英]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.