es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Laravel dónde recursivo para relación recursiva.

Tengo una tabla de hobbies como esta:

-id
-nombre
-parent_id

y mi modelo:

public function sub_hobbies(){
    return $this->hasMany(Hobbies::class, 'parent_id');
}

public function parent_hobbies(){
    return $this->belongsTo(Hobbies::class, 'parent_id');
}

public function allsub(){
    return $this->sub_hobbies()->with('allsub');
}

public function allparent(){
    return $this->parent_hobbies()->with('allparent');
}

Lo que quiero es obtener todos los hobbies que no son hijos ni nietos de los hobbies dados.

Por ejemplo, tengo esta lista:

-hobbies 1
  -hobbies 11
  -hobbies 12
    -hobbies 121
    -hobbies 122
  -hobbies 13
-hobbies 2
  -hobbies 21
  -hobbies 22
    -hobbies 221
    -hobbies 222
  -hobbies 23
-hobbies 3
  -hobbies 31
  -hobbies 32
    -hobbies 321
    -hobbies 322
  -hobbies 33

Si doy el id de hobbies 1, quiero todos los hobbies excepto hobbies 11, 12, 121, 122, 13.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los pasatiempos que no sean hijos ni nietos de un pasatiempo dado, podemos utilizar una función recursiva.

    public function getNonDescendants($idPasatiempo)
    {
        $pasatiempos = Hobbies::where('id', '<>', $idPasatiempo)->get();
        $resultado = [];
        foreach ($pasatiempos as $pasatiempo) {
            if (!$this->esDescendiente($pasatiempo, $idPasatiempo)) {
                array_push($resultado, $pasatiempo);
            }
        }
        return $resultado;
    }
    
    private function esDescendiente($pasatiempo, $idPasatiempo)
    {
        if (!$pasatiempo->parent_hobbies) {
            return false;
        }
        if ($pasatiempo->parent_hobbies->id == $idPasatiempo) {
            return true;
        }
        return $this->esDescendiente($pasatiempo->parent_hobbies, $idPasatiempo);
    }
    

    Aquí, hemos definido una función getNonDescendants() que toma como argumento un id de pasatiempo y devuelve todos los pasatiempos que no son hijos ni nietos de ese pasatiempo.

    Primero consultamos todos los pasatiempos excepto el pasatiempo dado, y luego recorremos cada uno de ellos para verificar si son descendientes del pasatiempo dado utilizando la función esDescendiente().

    La función esDescendiente() verifica si un pasatiempo es descendiente del pasatiempo dado verificando de forma recursiva si el padre del pasatiempo es el pasatiempo dado. Si lo es, significa que el pasatiempo es hijo o nieto del pasatiempo dado.

    Si un pasatiempo no es descendiente del pasatiempo dado, lo agregamos a un arreglo de resultados que se devuelve al final de la función.

    Al utilizar esta función con el id de pasatiempo 1, se devolverán todos los pasatiempos excepto los pasatiempos 11, 12, 121, 122 y 13.

Comments are closed.