Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有多重关联的多态关系_Php_Laravel_Laravel 4_Polymorphic Associations - Fatal编程技术网

Php 具有多重关联的多态关系

Php 具有多重关联的多态关系,php,laravel,laravel-4,polymorphic-associations,Php,Laravel,Laravel 4,Polymorphic Associations,我试图使用中间表来表示两个不同用户表(员工和非员工)之间的赞助关系,并满足以下要求: 赞助人可以是员工也可以是非员工 员工/非员工只能属于一个赞助人 一名员工可以有许多赞助者 我注意到Laravel的多态关系只支持单一关联。通常,它们使用关系中的中间表来防止创建具有相同签名的多个表。在我的例子中,我需要变形关系的双方,因为在任何时候我都可以让赞助者/赞助者属于任何一个表。我不确定我是否在这方面做得对,现在有点难堪 以下是我目前拥有的: Employees id sponsor_id Non

我试图使用中间表来表示两个不同用户表(员工和非员工)之间的赞助关系,并满足以下要求:

  • 赞助人可以是员工也可以是非员工
  • 员工/非员工只能属于一个赞助人
  • 一名员工可以有许多赞助者
我注意到Laravel的多态关系只支持单一关联。通常,它们使用关系中的中间表来防止创建具有相同签名的多个表。在我的例子中,我需要变形关系的双方,因为在任何时候我都可以让赞助者/赞助者属于任何一个表。我不确定我是否在这方面做得对,现在有点难堪

以下是我目前拥有的:

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');
}
public function sponsors() {
    return $this->morphMany('Sponsor', 'sponsorable');
}
public function sponsorable()
{
    return $this->morphOne('Sponsor', 'sponsorable');
}

public function sponsors()
{
    return $this->morphMany('Sponsor', 'sponsor');
}
Models/NonEmployee.php

public function sponsors() {
    return $this->morphMany('Sponsor', 'sponsorable');
}
public function sponsors() {
    return $this->morphMany('Sponsor', 'sponsorable');
}
public function sponsorable()
{
    return $this->morphOne('Sponsor', 'sponsorable');
}

public function sponsors()
{
    return $this->morphMany('Sponsor', 'sponsor');
}
Models/shandor.php

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

public function sponsorable()
{
    return $this->morphTo();
}
通过这种设置,我能够对赞助商表执行常规查找查询,然后对其进行反向工程以检索赞助商的名称

Sponsor::with('sponsorable')->get();
Sponsor::find(1)->sponsorable;

我提出了以下想法,利用现有的多态关系来处理多个关联

首先,我将模式更改为:

Employees
id

NonEmployees
id

Sponsors
id
sponsored_id
sponsored_type
sponsorable_id
sponsorable_type
因此,我从每个account type表中删除了赞助商id字段,并向赞助商表添加了第二个多态关系

我对模型进行了如下更新:

Models/Employee.php和Models/NonEmployee.php

public function sponsors() {
    return $this->morphMany('Sponsor', 'sponsorable');
}
public function sponsors() {
    return $this->morphMany('Sponsor', 'sponsorable');
}
public function sponsorable()
{
    return $this->morphOne('Sponsor', 'sponsorable');
}

public function sponsors()
{
    return $this->morphMany('Sponsor', 'sponsor');
}
Models/shandor.php

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

public function sponsorable()
{
    return $this->morphTo();
}
现在,因为Laravel不支持morphManyThrough()关系类型,您会注意到我更改了一些函数的名称,这样在使用关系时会读得更清楚一些,因为我必须从一个表经过一个中间表,然后到第三个表以获得我想要的信息

使用此结构,我可以执行以下操作:

$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

您所描述的“赞助商”和“员工”之间的关系看起来像一个“树”结构。对吗?i、 e.一名员工既可以是“赞助人”,也可以是另一名员工的“赞助人”?是的,没错。“非雇员”也是如此。对于这个特定的问题,它们之间没有什么区别,只是它们位于具有不同模式的不同表中。你有什么想法吗?你有逻辑来执行你的规则吗?我在思考“关系”中的“循环”。更像是“有向图”。如果“周期”发生,在处理过程中会发生什么?赞助功能是我正在研究的新功能,因此,如果有更好的方法来实现这一点,而不是由客户设定需求,那么它就不是一成不变的。我不确定我是否遵循你的思路,使用循环和有向图。你能详细说明一下吗?例如,员工A赞助员工B赞助员工C赞助员工A等等,在这里猜猜看。这可能不是问题。上面的代码仍在用于我需要它的应用程序。老实说,最棘手的部分是赞助商的语法,因为赞助方是“赞助商”,而被赞助方也是“赞助商”。这更像是命名约定的障碍,而不是代码的障碍。