Laravel / Eloquent通过约会会员表从多态“ member_id”获取所有约会

时间:2019-01-29 18:29:03

标签: laravel laravel-5 eloquent polymorphism laravel-5.4

我有一个appointments表和一个appointment_members表,我的用户需要通过用appointments搜索来获得"member_id"的集合,这可能是PersonIncidentCustomerIDappointment_members表具有member_idappointment_id列,因此member_type(也是一列)是不相关的。这一切都是由以前的开发人员建立的,而Eloquent模型上的关系则缺失了。我只是在创建一个简单的GET路由,该路由需要返回该member_id的任何/所有约会。每行都有一个约会,因此如果我要传递一个返回10个结果的member_id,则可能有多个应用,而另一些则没有,但是最终,我只需要一个与member_id。这是appointment_members表的屏幕截图: enter image description here

如果我创建一个与约会成员上的约会的简单hasOne关系:

public function appointments()
{
    return $this->HasOne(Appointment::class, 'id', 'appointment_id');
}

我可以分别使用appointment_members来获得appointment的集合,但是不确定如何将其归结为仅获取appointments。我所拥有的一种解决方法是使用HasOne,然后提取/过滤约会:

$appointmentMembers = AppointmentMembers::where('member_id', $request->input('memberId'))->get();
$appointments = $appointmentMembers->pluck('appointments')->filter();

好奇是否有人会发现更好的方法。谢谢!

1 个答案:

答案 0 :(得分:1)

我可能不太了解,但是如果成员类型不重要,我可能会采用最简单的方法。

该表已经设置为可以处理belongsToMany或morphMany,因此请在Member类上创建关系(或者,如果您没有父成员类,则将其粘贴在Person,Incident,等。当然,您也可以通过poly来做到这一点,但这是一个简单的示例,可以满足您的需求:

public function appointments()
{
    return $this->belongsToMany(Appointment::class)->withPivot('member_type');
} 

然后仅查询您需要约会的成员对象(使用poly即可完成这一步):

$allAppointmentsForID = $member->appointments();
$appointments = $allAppointmentsForID->wherePivot('member_type', $whateverClassThisIS);

以上内容考虑了member_type。如果这无关紧要,您可以只使用顶行。

您的原始数据库已设置为处理多态关系,因此,如果您想要的不仅仅是约会,您也可以通过这种方式进行设置。现在,您需要将TYPE添加到查询中以涵盖不同的类。

如果成员类型很重要,那么在Member类上,多态可能是这样的:

public function appointments()
{
    return $this->morphMany(Appointment::class, 'memberableOrmember_typeOrWhatever');
}

然后,您只需一行即可查询成员对象

$appointments = $member->appointments();
相关问题