Laravel 来自 hasMany 关系的预加载模型
Laravel eager load model from a hasMany relationship
有3个table:
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"
}
},
],
}
有没有一种方法可以通过 eloquent 急切加载(例如使用 With::
命令)来获取此数据,而不是遍历数据透视表、收集 user_id 并手动查询 User
table?
您需要定义 pivot
class 并将关系 belongsTo
添加到 user_id
的数据透视模型
用户模型
public function sent_compliments() {
return
$this->belongsToMany(
'Compliment',
'users_compliments',
'complimentor_id',
'compliment_id'
)->withPivot('user_id')->using('App\UserComplement');
}
枢轴模型
使用 Illuminate\Database\Eloquent\Relations\Pivot;
class UserComplement extends Pivot {
protected $table = 'users_compliments';
public function user(){
return $this->belongsTo('App\User', 'user_id');
}
}
飞思数据
//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);
}
有关详细信息,请查看此 定义自定义中间体 Table 模型 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');
}
用户补充模型
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);
}
希望它可以清除你
有3个table:
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"
}
},
],
}
有没有一种方法可以通过 eloquent 急切加载(例如使用 With::
命令)来获取此数据,而不是遍历数据透视表、收集 user_id 并手动查询 User
table?
您需要定义 pivot
class 并将关系 belongsTo
添加到 user_id
用户模型
public function sent_compliments() {
return
$this->belongsToMany(
'Compliment',
'users_compliments',
'complimentor_id',
'compliment_id'
)->withPivot('user_id')->using('App\UserComplement');
}
枢轴模型 使用 Illuminate\Database\Eloquent\Relations\Pivot;
class UserComplement extends Pivot {
protected $table = 'users_compliments';
public function user(){
return $this->belongsTo('App\User', 'user_id');
}
}
飞思数据
//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);
}
有关详细信息,请查看此 定义自定义中间体 Table 模型 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');
}
用户补充模型
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);
}
希望它可以清除你