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.

¿Cómo eliminar `contain()` agregado a la consulta por un comportamiento en Cakephp 4?

Estoy buscando la manera de hacer un equivalente a 'recursive' => -1 de cakephp2 en un find().

Tengo un modelo Categorias que utiliza el TreeBehavior.

En mi controlador obtengo la ruta de la categoría:

// en CategoriesController.php
$path = $this->Categories->find('path', ['for' => $id]);

Pero obtengo el mensaje de error No se puede cargar la asociación Photos. Asegúrese de seleccionar la clave externa en Categories.

El problema es que el find('path') anterior parece intentar buscar también el modelo asociado a Categorias, ya que Categorias utiliza otro comportamiento (AttachmentBehavior) que agrega contain('Photos'):

// en AttachmentBehavior (que es utilizado por CategoriesTable)
public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary)
{
    $query->contain('Photos');

    return $query;
}

¿Cómo puedo eliminar contain() en $this->Categories->find('path', ['for' => $id])? ¿Existe alguna opción?

Intenté $this->Categories->find('path', ['for' => $id, 'contain' => []]) pero obtengo el mismo error…

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar contain() en $this->Categories->find('path', ['for' => $id]), puedes pasar la opción recursive con un valor de -1, lo cual desactiva cualquier asociación y solo obtiene datos de la tabla principal. El código sería:

    $path = $this->Categories->find('path', ['for' => $id, 'recursive' => -1]);
    

    Esto debería solucionar el mensaje de error “No se puede cargar la asociación de Photos. Asegúrese de seleccionar la clave externa en Categories” ya que solo obtendrá datos de la tabla Categories sin ninguna asociación.

Comments are closed.