Laravel自动嵌套关系到模型

1zmg4dgp  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(182)

我想知道我是否可以从数据透视表中创建动态关系。我正在使用mariadb,我有如下结构表
user_has_profiles作为透视模型App\Models\PivotProfile
| 用户标识|配置文件标识|配置文件类型|
| - -|- -|- -|
| 唯一标识符-1| uuid向上|应用程序\模型\用户配置文件|
| 唯一标识符-1| uuid-传输协议|应用程序\模型\教师配置文件|
user_profiles作为模型App\Models\UserProfile
| 标识符|性别|生日|
| - -|- -|- -|
| uuid向上|雄的|2022年1月1日|
teacher_profiles作为模型App\Models\TeacherProfile
| 标识符|教师编号|乡村|
| - -|- -|- -|
| uuid-传输协议|TC-001注射液|法国Name|
如果使用模型Pivotprofile::get()进行查询,如何才能得到这样结果

[
 0 => [
   "user_id" => "uuid-1",
   "profile_id" => "uuid-up",
   "profile_type" => "App\Models\UserProfile",
   "profile" => [
           "id" => "uuid-up",
           "gender" => "male",
           "birthday" => "2022-01-01"
   ]
 ],
 1 => [
   "user_id" => "uuid-1",
   "profile_id" => "uuid-tp",
   "profile_type" => "App\Models\TeacherProfile",
   "profile" => [
           "id" => "uuid-tp",
           "teacher_number" => "TC-001",
           "country" => "France"
   ]
 ],
]

因此,PivotProfile会根据profile_type自动建立关系。或者,如果用户有多个配置文件表,您可以在结构表中选择更好的选项。谢谢

bf1o4zei

bf1o4zei1#

实现这一点的一个选项是在PivotProfile模型中创建多态关系。
首先,在PivotProfile模型中定义关系:

public function profile()
{
    return $this->morphTo();
}

然后,可以在查询中使用morphTo()方法来检索相关的概要文件模型:

$profiles = PivotProfile::with('profile')->get();

这将根据数据透视表中的“profile_type”字段返回一个包含相关配置文件模型的“profile”属性的PivotProfile对象集合。
然后,您可以循环访问集合并访问每个透视表配置文件的配置文件数据:

foreach ($profiles as $profile) {
    $profileData = $profile->profile;

    // access profile data here, e.g. $profileData->gender
}

请注意,此解决方案假定您已在透视表的profile_type字段中定义了正确的变形类。例如,如果profile_type为“App\Models\UserProfile”,则UserProfile模型应将$morphClass属性设置为“App\Models\UserProfile”。
希望这对你有帮助!如果你有任何进一步的问题,请告诉我。

相关问题