Как модельные отношения работают в этом контексте? - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно создать массив, где необходимо хранить информацию о конкретной регистрации в конференции. Необходимо хранить:

  • название конференции
  • название типа регистрации и цена
  • также в массиве необходимо хранить количество каждого типа регистрации для конкретной регистрации. Количество можно получить с помощью таблицы участников, поскольку структура таблицы участников выглядит следующим образом: таблица участников: 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: []
    }
  ]
}

Вы понимаете, как "$name = $p->registration_type->name;" в foreach получает правильное имя типа регистрации?

Также $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 голосов
/ 03 июля 2018

Я замечаю, что вызывающий $registrationTypeDetails->participants возвращает отношения участников к Registration (это не загружено)

Когда вы позвонили:

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

Он извлекает одну запись Registration, используя registrationId с загруженными отношениями. Но когда вы используете следующее $registrationTypeDetails->participants Вы делаете новый запрос, используя запись, поэтому у вас есть participants коллекции моделей, на которых вы можете запустить цикл.

Это работает, потому что вы уже определили отношения между Registration и Participant (вероятность того, что это неправильно, ограничена).

Поскольку вы не пытались загрузить отношение participants, когда вы это сделали $registrationTypeDetails->participants, вы не ожидаете, что оно покажет вам отношения. Даже если вы заметили, dd($registrationTypeDetails) показывает результат вашего первого загруженного запроса.

Тот же эффект наблюдается при циклическом вызове $p->registration_type->name;. При этом также выполняется новый запрос с использованием одной записи в точке цикла (эта запись имеет свойство скажем registration_type_id, которое ссылается на отношение registration_type на participants столе ... и так далее ...

Таким образом, это объяснение того, почему вы можете получить доступ к связанным моделям в виде коллекций, не используя методы with() или load().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...