在下面的图片中,我们可以看到我的表之间的关系。 我的目标是从 driver_license_types 获得“ 类型”。从用户对象开始。 例如:
$user = User::find(1);
,然后从那里获取driver_license_types的类型。 重要的事情是,讲师在讲师类型表中的记录很少,如下所示:
我当前的解决方案:
有没有更好的解决方案?
答案 0 :(得分:1)
如果您在belongsToMany
模型中没有为Instructor
建立DriverLicenseType
关系,我建议您放入一个:
public function licenseTypes()
{
return $this->belongsToMany(DriverLicenseType::class, 'instructors_license_types', 'instructor_id', 'driver_license_type_id');
}
$user = User::find(1);
$licenseTypes = $user->instructor->licenseTypes->pluck('type')->unique();
或者如果您需要将$licenseTypes
设置为问题格式,则可以执行以下操作:
$licenseTypes = $user->instructor->licenseTypes->map(function ($item) {
return [$item->id, $item->type];
});
答案 1 :(得分:0)
您可以通过添加以下函数直接从Instructors模型中获取driver_license_types:
//PathToModel\Instructor.php
public function license_types()
{
return $this->belongsToMany('PathToModel\LicenseTypes', 'instructors_license_types');
}
还将其添加到LicenseType模型中:
//PathToModel\LicenseTypes.php
public function instructors()
{
return $this->belongsToMany('PathToModel\Instructors', 'instructors_license_types');
}
这样,您将可以在代码中删除其中一个foreach语句:
$user = User::find($id);
if($user->instructor){
$tmp = [];
foreach ($user->instructor->license_types as $data) {
array_push($tmp, [$data->id, $data->type]);
}
$user->types = $tmp;
}
这只是跳过数据透视表(instructos_license_types),有关此的更多信息,请参阅文档here。