在这种情况下,模型关系如何工作?

时间:2018-07-03 19:30:19

标签: laravel

我需要创建一个数组,用于在会议中存储有关特定注册的信息。需要存储:

  • 会议名称
  • 注册类型名称和价格
  • 数组中还必须
  • 来存储特定注册的每种注册类型的数量。可以使用参与者表获取数量,因为参与者表的结构类似于:参与者表:id,registration_id,registration_type_id。因此可以为特定的registration_id计算该注册中存在多少个registration_type_id。

因此有必要进行涉及3个表的注册,会议和与会人员的查询,由于模型关系正确,所以查询应如下所示,并且顺序为“ conference.registrationTypes.participants”?

    $registrationTypeDetails = Registration::with('conference.registrationTypes
    .participants')->find($registrationID);

然后下面的此foreach分别将每种注册类型的数量存储在$type_counts中,并且$type_counts显示如下:

 array:2 [▼
      "general" => 2
      "plus" => 1
    ]

代码:

  $type_counts = [];
    foreach ($registrationTypeDetails->participants as $p) {
        $name = $p->registration_type->name;
        if (!isset($type_counts[$name])) {
            $type_counts[$name] = 0;
        }
        $type_counts[$name]++;
    }

但是我不理解$ type_counts是如何显示的,关系如何工作来获得该结果,因为dd($registrationTypeDetails)如下所示。

$registrationTypeDetails->participants如下所示,该关系为空,所以我不明白“ $p->registration_type->name”如何显示注册类型名称。

Collection {#335 ▼
  #items: array:2 [▼
    0 => Participant {#350 ▼
      #relations: []
    }
    1 => Participant {#343 ▼
      #relations: []
    }
  ]
}

您是否了解foreach中的“ $name = $p->registration_type->name;”如何获得正确的注册类型名称?

另外$registrationTypeDetails显示:

Registration {#334 ▼
  #relations: array:1 [▼
    "conference" => Conference {#342 ▼
      #relations: array:1 [▼
        "registrationTypes" => Collection {#346 ▼
          #items: array:2 [▼
            0 => RegistrationType {#349 ▼
              #relations: array:1 [▼
                "participants" => Collection {#514 ▶}
              ]
            }
            1 => RegistrationType {#351 ▼
              #relations: array:1 [▼
                "participants" => Collection {#348 ▶}
              ]
            }
          ]
        }
      ]
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

我发现呼叫方$registrationTypeDetails->participants检索到与Registration的参与者关系(这并不急切)

致电时:

Registration::with('conference.registrationTypes.participants')->find($registrationID);

它使用具有迫切关系的Registration来检索registrationId的单个记录。但是,当您使用以下$registrationTypeDetails->participants时,您是在使用记录进行新查询,因此为何拥有participants个模型集合并可以对其进行循环。

之所以有效,是因为您已经定义了RegistrationParticipant之间的关系(这是错误的可能性很小。)

因为在执行participants时您并不急于加载$registrationTypeDetails->participants关系,所以您不希望它显示您的关系。即使您注意到dd($registrationTypeDetails)会向您显示第一个急切加载的查询的结果。

当您在循环中执行名为$p->registration_type->name;的循环时,会看到相同的效果。这还会在循环点使用单个记录运行一个新查询(该记录具有引用registration_type_id的两个属性registration_type表上的participants关系...依此类推...

总而言之,这就是为什么不使用with()load()方法就可以将相关模型作为集合访问的原因的说明。