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

  • session 名称
  • 注册类型名称和价格
  • 数组中的
  • 也是必要的,用于存储特定注册的每种注册类型的数量。数量可以使用participants表来获取,因为participants表的结构是这样的:participants表:id、registration_id、registration_type_id。因此,可以针对特定的 registration_id 计算该注册存在多少个 registration_type_id。

  • 所以有必要做一个涉及注册, session 和参与者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 ▶}
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
    

    最佳答案

    我观察到调用 $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; 时看到同样的效果这也使用循环点的单个记录运行一个新的查询(这个记录有两个属性 say registration_type_id 引用 registration_type 表上的 participants 关系......等等...

    总之,这就是为什么您可以在不使用 with()load() 方法的情况下将相关模型作为集合访问的解释。

    关于laravel - 模型关系在这种情况下是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51161718/

    10-09 18:20