具有多个关联的多态关系
Polymorphic Relationship with Multiple Associations
我正在尝试使用中介 table 来表示两个不同用户 table(员工和非员工)之间的赞助关系,并满足以下要求:
- 发起人可以是员工或非员工。
- 一个 Employee/Non-Employee 只能属于一个赞助商。
- 一个员工可以有多个发起人。
我注意到 Laravel 的多态关系只支持单一关联。通常他们在关系中使用中介 table 来避免必须创建多个具有相同签名的 table。在我的例子中,我需要变形关系的双方,因为在任何时候我都可以让 sponsor/sponsored 人属于任何一个 table。我不确定我是否正在做这件事,此刻有点难过。
这是我目前拥有的:
Employees
id
sponsor_id
NonEmployees
id
sponsor_id
Sponsors
id
sponsorable_id
sponsorable_type
接下来,我设置了以下模型:
Models/Employee.php
public function sponsors() {
return $this->morphMany('Sponsor', 'sponsorable');
}
Models/NonEmployee.php
public function sponsors() {
return $this->morphMany('Sponsor', 'sponsorable');
}
Models/Sponsor.php
public function sponsorable() {
return $this->morphTo();
}
通过此设置,我能够对赞助商 table 执行一般查找查询,然后对它们进行逆向工程以检索赞助商的名称。
Sponsor::with('sponsorable')->get();
Sponsor::find(1)->sponsorable;
我想出了以下想法来利用现有的多态关系来处理多个关联。
首先,我将架构更改为:
Employees
id
NonEmployees
id
Sponsors
id
sponsored_id
sponsored_type
sponsorable_id
sponsorable_type
因此,我从每个帐户类型 table 中删除了 sponsor_id 字段,并向赞助商 table 添加了第二个多态关系。
我更新了模型如下:
Models/Employee.php & Models/NonEmployee.php
public function sponsorable()
{
return $this->morphOne('Sponsor', 'sponsorable');
}
public function sponsors()
{
return $this->morphMany('Sponsor', 'sponsor');
}
Models/Sponsor.php
public function sponsor()
{
return $this->morphTo();
}
public function sponsorable()
{
return $this->morphTo();
}
现在,因为 Laravel 不支持 morphManyThrough() 关系类型,您会注意到我更改了一些函数的名称,以便在使用关系时它看起来更清晰一些,因为我必须从一个 table 通过中间人 table 然后到第三个 table 才能获得我想要的信息。
有了这个结构,我可以做以下事情:
$employee = Employee::find(2)->sponsorable->sponsor; // Gets employee's sponsored party
$sponsors = $employee->sponsors; // Gets individual that the employee is sponsoring.
foreach ($sponsors as $sponsor)
echo $sponsor->sponsorable->first_name;
$employee->sponsors()->save(new Sponsor()); // New sponsor
$non_employee->sponsors()->save(new Sponsor()); // New sponsor
我还可以进行反向查找:
Sponsor::find(1)->sponsor->first_name; // Sponsoring party
Sponsor::find(1)->sponsorable->first_name; // Party being sponsored
我正在尝试使用中介 table 来表示两个不同用户 table(员工和非员工)之间的赞助关系,并满足以下要求:
- 发起人可以是员工或非员工。
- 一个 Employee/Non-Employee 只能属于一个赞助商。
- 一个员工可以有多个发起人。
我注意到 Laravel 的多态关系只支持单一关联。通常他们在关系中使用中介 table 来避免必须创建多个具有相同签名的 table。在我的例子中,我需要变形关系的双方,因为在任何时候我都可以让 sponsor/sponsored 人属于任何一个 table。我不确定我是否正在做这件事,此刻有点难过。
这是我目前拥有的:
Employees
id
sponsor_id
NonEmployees
id
sponsor_id
Sponsors
id
sponsorable_id
sponsorable_type
接下来,我设置了以下模型:
Models/Employee.php
public function sponsors() {
return $this->morphMany('Sponsor', 'sponsorable');
}
Models/NonEmployee.php
public function sponsors() {
return $this->morphMany('Sponsor', 'sponsorable');
}
Models/Sponsor.php
public function sponsorable() {
return $this->morphTo();
}
通过此设置,我能够对赞助商 table 执行一般查找查询,然后对它们进行逆向工程以检索赞助商的名称。
Sponsor::with('sponsorable')->get();
Sponsor::find(1)->sponsorable;
我想出了以下想法来利用现有的多态关系来处理多个关联。
首先,我将架构更改为:
Employees
id
NonEmployees
id
Sponsors
id
sponsored_id
sponsored_type
sponsorable_id
sponsorable_type
因此,我从每个帐户类型 table 中删除了 sponsor_id 字段,并向赞助商 table 添加了第二个多态关系。
我更新了模型如下:
Models/Employee.php & Models/NonEmployee.php
public function sponsorable()
{
return $this->morphOne('Sponsor', 'sponsorable');
}
public function sponsors()
{
return $this->morphMany('Sponsor', 'sponsor');
}
Models/Sponsor.php
public function sponsor()
{
return $this->morphTo();
}
public function sponsorable()
{
return $this->morphTo();
}
现在,因为 Laravel 不支持 morphManyThrough() 关系类型,您会注意到我更改了一些函数的名称,以便在使用关系时它看起来更清晰一些,因为我必须从一个 table 通过中间人 table 然后到第三个 table 才能获得我想要的信息。
有了这个结构,我可以做以下事情:
$employee = Employee::find(2)->sponsorable->sponsor; // Gets employee's sponsored party
$sponsors = $employee->sponsors; // Gets individual that the employee is sponsoring.
foreach ($sponsors as $sponsor)
echo $sponsor->sponsorable->first_name;
$employee->sponsors()->save(new Sponsor()); // New sponsor
$non_employee->sponsors()->save(new Sponsor()); // New sponsor
我还可以进行反向查找:
Sponsor::find(1)->sponsor->first_name; // Sponsoring party
Sponsor::find(1)->sponsorable->first_name; // Party being sponsored