2
respostas

Resolução do desafio: está correto?

Olá.

Eu tentei resolver o desafio proposto em aula, da maneira que pensei, está correto? OBS: Os dois fragmentos de códigos abaixo pertencem a mesma classe

public function studentsWithPhones(): array 
    {
        $sql = "SELECT 
        students.id, 
        students.name, 
        students.birth_date, 
        phones.id AS phone_id, 
        phones.area_code, 
        phones.number 
        FROM students 
        INNER JOIN phones ON phones.student_id = students.id";

        $sql = $this->pdo->query($sql);
        $result = $sql->fetchAll();
        $studentList = [];

        foreach ($result as $row) {
            $this->insertPhoneInStudents($row, $studentList);
        }

        return $studentList;
    }
private function insertPhoneInStudents($data, &$studentList): void
    {
        if(!array_key_exists($data['id'], $studentList)) {
            $studentList[$data['id']] = new Student($data['id'], $data['name'], new \DateTimeImmutable($data['birth_date']));
        }

        $phone = new Phone($data['phone_id'], $data['area_code'], $data['number']);
        $studentList[$data['id']]->addPhone($phone);
    }
2 respostas

Oi Rafael, não sei exatamente o que esta pedindo no exercicio... porém, analisando o seu primeiro código, parece estar tudo ok. Abaixo, vai apenas alguns sugestões de possíveis melhoria na legibilidade e eficiência;

public function studentsWithPhones(): array 
    {
        $sql = "SELECT students.id, students.name, students.birth_date, phones.id AS phone_id, phones.area_code, phones.number 
                FROM students 
                INNER JOIN phones ON phones.student_id = students.id";

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll();
        $studentList = [];

        foreach ($result as $row) {
            $this->insertPhoneInStudents($row, $studentList);
        }

        return $studentList;
    }

O que eu fiz acima foi utilizar o "prepared statement" do PDO ao invés de passar a query diretamente ao método query, para evitar problemas de segurança.

O seu método insertPhoneInStudents também parece estar correto. Abaixo eu fiz pequenos ajustes, apenas para você ter mais uma opção... no caso, eu penas estou verificando se os dados necessários existem... antes de seguir

private function insertPhoneInStudents($data, &$studentList): void
{
    //Checking if the required data is present
    if (empty($data['id']) || empty($data['name']) || empty($data['birth_date'])) {
        throw new Exception("Missing required data to create a new student object.");
    }
    if (empty($data['phone_id']) || empty($data['area_code']) || empty($data['number'])) {
        throw new Exception("Missing required data to create a new phone object.");
    }

    // check if student already exists in the list
    if(!array_key_exists($data['id'], $studentList)) {
        //create new student and add to the list
        $student = new Student($data['id'], $data['name'], new \DateTimeImmutable($data['birth_date']));
        $studentList[$data['id']] = $student;
    }

    //create new phone
    $phone = new Phone($data['phone_id'], $data['area_code'], $data['number']);

    //add phone to student
    $studentList[$data['id']]->addPhone($phone);
}