无法访问 HasManyThrough 关系中的中间 table
Cannot access Intermediate table in HasManyThrough relationship
我的数据库模式看起来像 this.
现在,在 artisan tinker 模式下,当我尝试从用户模型查询详细信息 table 时,它显示了详细信息的记录 table 但我无法访问某些案例模型原因,在 tinker 中它总是 returns NULL。
这是我的用户模型
public function details()
{
return $this->hasManyThrough('App\Models\Detail', 'App\Models\Cases', 'user_id', 'case_id', 'id', 'id');
}
我做错了什么?
hasManyThrough
的思路是跳过中间table。如果您需要查看案例和细节,也许您应该为其定义其他关系。
// User model
public function cases()
{
return $this->hasMany(Cases::class, 'user_id');
}
// Cases model
public function details()
{
return $this->hasMany(Detail::class, 'user_id');
}
$users = User::with('cases.details')->get();
foreach ($users as $user) {
// an user
foreach ($user->cases as case) {
// a case
foreach ($case->details as $detail) {
// the details of a case
}
}
}
如果为了方便起见,您想直接从用户模型访问详细信息,那么您可以将关系定义为 -(可能看起来有点重复,但如果它容易实现则值得)
class User extends Model
{
public function cases()
{
return $this->hasMany(Case::class);
}
public function details()
{
return $this->hasManyThrough(Detail::class, Case::class);
}
}
class Case extends Model
{
public function details()
{
return $this->hasMany(Detail::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
class Detail extends Model
{
public function case()
{
return $this->belongsTo(Case::class);
}
}
现在可以通过用户记录直接访问案例和详细信息
$user->cases;
$user->details;
我的数据库模式看起来像 this.
现在,在 artisan tinker 模式下,当我尝试从用户模型查询详细信息 table 时,它显示了详细信息的记录 table 但我无法访问某些案例模型原因,在 tinker 中它总是 returns NULL。
这是我的用户模型
public function details()
{
return $this->hasManyThrough('App\Models\Detail', 'App\Models\Cases', 'user_id', 'case_id', 'id', 'id');
}
我做错了什么?
hasManyThrough
的思路是跳过中间table。如果您需要查看案例和细节,也许您应该为其定义其他关系。
// User model
public function cases()
{
return $this->hasMany(Cases::class, 'user_id');
}
// Cases model
public function details()
{
return $this->hasMany(Detail::class, 'user_id');
}
$users = User::with('cases.details')->get();
foreach ($users as $user) {
// an user
foreach ($user->cases as case) {
// a case
foreach ($case->details as $detail) {
// the details of a case
}
}
}
如果为了方便起见,您想直接从用户模型访问详细信息,那么您可以将关系定义为 -(可能看起来有点重复,但如果它容易实现则值得)
class User extends Model
{
public function cases()
{
return $this->hasMany(Case::class);
}
public function details()
{
return $this->hasManyThrough(Detail::class, Case::class);
}
}
class Case extends Model
{
public function details()
{
return $this->hasMany(Detail::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
class Detail extends Model
{
public function case()
{
return $this->belongsTo(Case::class);
}
}
现在可以通过用户记录直接访问案例和详细信息
$user->cases;
$user->details;