[RESUELTO] Asingar valor de un campo al array devuelto por findAllBySQL

Tengo la necesidad de que un array devuelto por findAllBySQL no me lo devuelva con un array asociativo por cada registro y esté numerado, sino que utilice un valor de los campos de la búsqueda.

Para aclarar mejor mi inquietud:

$items=Color::model()->findAllBySql($sSQL,array(’:colCodigo’=>$model->colCodigo));

me devuelve:

$items

[0]

[n]

Y necesitaría que me devolviera

$items

[valor_campo_registro_0]

[valor_campo_registro_n]

De esa manera evitaría recorrer toooodo el array buscando por $items[$i][’_attributes’][campo_a_buscar]…

Hay manera de lograr eso… o Yii posee algún método que indicandole el campo y el valor me devuelva el array en cuestión sin consultar 2 veces la DB?

Gracias desde ya por las respuestas :)

E.

Eso lo tenés que hacer vos a mano…

Saludos,

Tu pregunta es un poco extranya o no la he entendido bien.

Tu buscas la base de datos por un codigo en cuestion, y despues filtras el resultado?

Porque no haces la busqueda y el filtrado directamente en SQL?

Sino, y desde el bucle no hay otra manera de hacerlo que recrear tu mismo el array que deseas tal y como indico anteriormente sebas.

Es normal que te devuelvan los items numerados ya que son los registros devueltos.

La necesidad redundaba en "identificar" los registros en el array sin tener que recorrerlos. Por lo tanto un array "asociativo" es lo más sencillo en este caso…

De todos modos lo resolví de esta manera:

  • Recuperar los registros de la tabla/vista/etc

  • recorrer el array resultado con un foreach y por cada elemento asignarlo en un nuevo array de este modo:

    nuevoarray [campo_clave] = arrayresultado[iterador];

  • Eliminar el array resultado (por ser prolijo nomás)

De esa manera, se puede tener un array con los datos y utilizar el registro/s en cuestión donde sea necesario identificando el elemento con la clave deseada o necesaria en ese caso.

En mi caso necesitaba identificar los registros por el código de idioma. Es mucho más fácil de entender: nuevoarray[‘es’] para acceder a los datos en español y luego mostrar los datos en otro idioma (en la misa iteración) que recorrer para identificar el dato en ‘es’, luego iterar para los otros resultados; o bien, acceder dos veces a la DB una para devolver el dato en ‘es’ y luego los datos no iguales a ‘es’… A veces este segundo caso no es posible o es más engorroso.

Gracias por el interés…

E.

PD: ¿alqguien sabe como marcar este "hilo" como "solucionado"?..

edita el titulo del topico

por cierto, echale un vistazo a MultilingualActiveRecord. Eso me soluciono muchas cosas con traducciones!

Un saludo

Antonio,

gracias por el TIP del post… NO encontraba dónde hacerlo… Como verás, ya lo hice…

En cuanto a tu recomendación, había pasado por esa opción… Pero ya tenía todo "proyectado" para hacerlo de otra manera con una sola tabla.

A modo de ejemplo, supongamos esta situación: una tabla de idiomas disponibles, artículos, y otra de colores.

La tabla de idiomas: idiCodigo, idiDescripcion (siempre en español o ‘es’, q lo llamaremos “idioma bandera”)

La tabla de artículos tiene (para abreviar) 3 campos: artCodigo, artDescripcion, idiCodigo

La de colores es similar: colCodigo, colDescripcion, idiCodigo

Una cuarta tabla se utilizará para "unir" artCodigo con colCodigo,

Para "administrar" un artículo o un color se utiliza un "right join" entre la tabla de idiomas y artículos (o colores, es lo mismo en este caso), de esta manera siempre se estará trabajando "simultáneamente" con tantos registros como existan en la tabla idioma

Si es un “alta” es “obligatorio” el dato del registro cuyo “idiCodigo” es = a ‘es’, los otros son “optativos” en esta instancia. Si es una modificación, sólo será sobre los registros cuyo idiCodigo != ‘es’. Si es una “eliminación” se eliminan todos los registros que correspondan a ese código de artículo o color sin importar el idioma.

Por esto necesitaba identificar en el array de respuesta a los registros por el código de idioma y no por un número.

Para cerrar (y no dejarte con la historia sin final :) ), cuando uno la tabla de articulos con la de colores, por medio de la tabla de articulo-color, “filtro” también por idiCodigo (de ambas o una de ellas) y de esa manera tengo el par descripcion de artículo y color en el idioma necesario…

No sé que tan buena o mala haya sido la estrategia que seguí, pero me "ahorro" una tabla y me "redoblo" el trabajo… Pero ya está hecho … jaja!

Gracias por tu interés…

Saludos…

E.

Bueno, me alegro que hayas encontrado una solución. Gracias por la información, he visto que utilizas lo mismo que yo utilizaba anteriormente manteniendo sólo una tabla.

Yo modifiqué los objetos de Multilingual para poder trabajar tal y como yo queria, prefiriendo tener una tabla separada del lenguaje por defecto (español) y los demás idiomas.

En el método localized() de la extension puse un parámetro que me indicaba el lenguaje que debia mostrarse en las propiedades. Y una serie de objetos (Language y Translation) que controlan las peticiones de idioma del usuario y el uso de traducciones en el panel y la pagina Web.

Bueno, que me enrollo más que una persiana… al final todos debemos trabajar de la mejor manera posible y de la forma que nos encontremos más cómodos.

Te mando un saludo y ‘congratulations’