Propiedades de acceso del objeto fuera de la proa
Tengo algunos datos provenientes del db a través de un modelo
public static function loadPermissions($user_role)
{
$db = \Config\Database::connect();
$builder = $db->table('role_has_perm');
$builder->select('*');
$builder->join('perms', 'perms.id_perm = role_has_perm.id_perm', 'left');
$builder->join('roles', 'roles.id_role = role_has_perm.id_role');
$builder->where('role_has_perm.id_role', $user_role);
$query = $builder->get();
return $query->getResultObject();
}
Ahora si lo azoto con un bucle de anteceso puedo escupir los datos.
foreach ($query as $row) {
echo "id_role = " . $row->id_role . " " . "id_perm = " . $row->id_perm . " " . "role_name = " . $row->role_name;
$role = $row->role_name;
}
Sin embargo, no siempre quiero pasar por todo el objeto. Quiero acceder a propiedades específicas. Quiero acceder sólo al nombre_de roles por ejemplo.
$role = $query->role_name;
Tengo este error: Tratando de obtener propiedad 'role_name' de non-object
¿Estoy manipulando el objeto mal?
Toda aportación es bienvenida:)
Alex
Pregunta hecha hace 3 años, 5 meses, 5 días - Por javajedi
3 Respuestas:
-
Aparentemente, la variable $query contiene un array. Así que solo necesitas acceder a un elemento del array por índice. El siguiente fragmento le daría el primer elemento de la matriz.
$role = $query[0]->role_name;
Como alternativa puedes buscar un solo específico crudo.
Respondida el Dec 18, 2020 a las 08:35 - por techinnovator
Votos positivos: 0 | Votos negativos: 0 -
Sí, estás tratando de acceder a una propiedad directamente en el objeto
$query
, pero$query
no es un objeto que contenga las filas de resultados de la consulta. En su lugar, contiene el resultado de la consulta a través de la función$builder->get()
. Por lo tanto,$query
es un objeto de tipoCodeIgniter\Database\ResultInterface
.Para acceder a propiedades específicas, debes primero obtener las filas de resultado mediante el método
getResult()
en lugar degetResultObject()
. Luego puedes usar un bucleforeach
para iterar sobre las filas y acceder a las propiedades específicas de cada fila.Aquí te muestro cómo puedes corregir tu código:
php public static function loadPermissions($user_role) { $db = \Config\Database::connect(); $builder = $db->table('role_has_perm'); $builder->select('*'); $builder->join('perms', 'perms.id_perm = role_has_perm.id_perm', 'left'); $builder->join('roles', 'roles.id_role = role_has_perm.id_role'); $builder->where('role_has_perm.id_role', $user_role); $query = $builder->get(); return $query->getResult(); } // Luego en tu código de uso: $results = ModelName::loadPermissions($user_role); foreach ($results as $row) { echo "role_name = " . $row->role_name; // Acceder solo a la propiedad "role_name" }
Con estos cambios, deberías poder acceder y mostrar solo la propiedad
role_name
de cada fila de resultado.Respondida el Dec 19, 2020 a las 08:30 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Sí, estás manipulando el objeto incorrectamente.
El método
getResultObject()
devuelve un array de objetos, no un solo objeto. Por lo tanto, necesitas iterar sobre el array para acceder a las propiedades de cada objeto.Aquí tienes el código corregido:
php foreach ($query as $row) { echo "id_role = " . $row->id_role . " " . "id_perm = " . $row->id_perm . " " . "role_name = " . $row->role_name; $role = $row->role_name; }
También puedes acceder a las propiedades de los objetos directamente dentro del bucle:
php foreach ($query as $row) { echo "id_role = {$row->id_role} " . "id_perm = {$row->id_perm} " . "role_name = {$row->role_name}"; $role = $row->role_name; }
Respondida el Dec 19, 2020 a las 08:45 - por Gemini
Votos positivos: 0 | Votos negativos: 0