Laravel 5.4-几个表中的多个关系

时间:2019-05-21 20:40:37

标签: php laravel laravel-5 eloquent

在下面的图片中,我们可以看到我的表之间的关系。 我的目标是从 driver_license_types 获得“ 类型”。从用户对象开始。 例如:

$user = User::find(1);

,然后从那里获取driver_license_types的类型。 重要的事情是,讲师在讲师类型表中的记录很少,如下所示: Records instructor_license_types Relations between my tables

我当前的解决方案:

  • 在用户模型中,我创建了方法指导者,该关系是“ belongTo”指导者模型。
  • 在讲师模型中,我创建了方法许可证,该许可证与Instructor_license_types具有“ hasMany”关系
  • 在Instructor_license_types中,创建与Driver_license_types关系为“ hasMany”的方法类型。

最终代码如下: enter image description here

有没有更好的解决方案?

2 个答案:

答案 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