0

Buen día estoy haciendo un merge en mi base de datos, donde uno un objeto con otro que retorna una galería y alfinal debo regresar un JSON, Aquí mi código en PHP usando Eloquent/Laravel:

public function getProperty($prop){
        $property = Property::where("code", $prop)->first();

        $images = Photo::where("property_id", $property['company_id'])->get();

        $decodedImages = json_decode($images, true);
        $decodedProperty = json_decode($property, true);

        $merged = array_merge($decodedProperty, $decodedImages);

        return $merged;
    }

Y la respuesta de la peticion GET en POSTMAN es esta:

{
    "id": 1,
    "country": 1,
    "city": 729,
    "zone": 4,
    "neighborhood": "at",
    "type": 9,
    "biz": 2,
    "status": 1,
    "area": 214,
    "area_built": 368,
    "area_private": 207,
    "floor": 2,
    "floor_quantity": 3,
    "bedrooms": 4,
    "bathrooms": 3,
    "parking": 0,
    "stratum": 1,
    "rent": "247.29",
    "sale": "261.91",
    "administration": "278.28",
    "description_demo": "Quo quidem autem ducimus harum animi est reprehenderit.",
    "built_at": 1994,
    "photo": "https://via.placeholder.com/640x480.png/007733?text=animals+voluptatibus",
    "published_date": "2022-08-22",
    "latitude": 63.3599999999999994315658113919198513031005859375,
    "longitude": 5.37000000000000010658141036401502788066864013671875,
    "featured": 0,
    "video": "https://via.placeholder.com/640x480.png/000022?text=animals+occaecati",
    "destination": 7,
    "score": 84,
    "0": {
        "id": 1,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/0099ee?text=animals+numquam",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    "1": {
        "id": 2,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/009988?text=animals+qui",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    "2": {
        "id": 3,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/000055?text=animals+explicabo",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    "3": {
        "id": 4,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/002277?text=animals+sint",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    }
}

Pero quisiera que al final quedara una propiedad llamada gallery con una array de objetos dentro del mismo json tal como este ejemplo que pongo ahora, he intentado convertirlos primero en array y hacer el merge para posteriormente retornar un JSON pero no logro conseguir que quedé así:

{
    "id": 1,
    "country": 1,
    "city": 729,
    "zone": 4,
    "neighborhood": "at",
    "type": 9,
    "biz": 2,
    "status": 1,
    "area": 214,
    "area_built": 368,
    "area_private": 207,
    "floor": 2,
    "floor_quantity": 3,
    "bedrooms": 4,
    "bathrooms": 3,
    "parking": 0,
    "stratum": 1,
    "rent": "247.29",
    "sale": "261.91",
    "administration": "278.28",
    "description_demo": "Quo quidem autem ducimus harum animi est reprehenderit.",
    "built_at": 1994,
    "photo": "https://via.placeholder.com/640x480.png/007733?text=animals+voluptatibus",
    "published_date": "2022-08-22",
    "latitude": 63.3599999999999994315658113919198513031005859375,
    "longitude": 5.37000000000000010658141036401502788066864013671875,
    "featured": 0,
    "video": "https://via.placeholder.com/640x480.png/000022?text=animals+occaecati",
    "destination": 7,
    "score": 84,
    "gallery": [
    {
        "id": 1,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/0099ee?text=animals+numquam",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    {
        "id": 2,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/009988?text=animals+qui",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    {
        "id": 3,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/000055?text=animals+explicabo",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    },
    {
        "id": 4,
        "property_id": 1,
        "url": "https://via.placeholder.com/640x480.png/002277?text=animals+sint",
        "created_at": "2022-08-22T16:44:34.000000Z",
        "updated_at": "2022-08-22T16:44:34.000000Z"
    }
}
1
  • El problema está donde se originan esos datos, si puedes intervenir en esa parte, debes hacerlo, para que la respuesta no venga con los índices 0, 1, 2, 3, 4 ... como nombres de propiedad. Eso obligará a conocer de antemano cada propiedad (índice realmente) para poder referirte a sus valores, factible únicamente si todas las respuestas tuvieran la misma cantidad de índices, cosa muy improbable. En este caso hay que resolver el problema en el código que genera los datos organizados de ese modo. Si no depende de ti debes informarte sobre otro modo de consultar esa API.
    – A. Cedano
    Commented el 22 ago. 2022 a las 19:17

1 respuesta 1

1

Tienes que codificar en formato JSON. Reemplazar por $merged:

$decodedProperty['galeria'] = $decodedImages;

return json_encode($decodedProperty);
1
  • Gracias Anibal, me funcionó lml Commented el 22 ago. 2022 a las 21:27

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.