Wczoraj mój serwer na żywo axios.get => response od wywołania mojej trasy /products był array of objects [{...},{...} ...].

axios
    .get("/products")
    .then((res) => {
        setProds(res.data); // output [{...},{...} ...]
    })
    .catch((err) => {
        console.error(err);
    }); 

Nagle dziś rano odpowiedź z tej samej trasy /products stała się object with objects {"0": {...}, "1": {...} ...} tylko na serwerze na żywo .

Serwer LocalHost, jak zwykle, wysyłając array of objects [{...},{...} ...].

Dev Server response.data

[
    {
        "id": 1,
        "name": "Don Julio 70 700ml",
        "description": "Corporis voluptates occaecati commodi illum recusandae dicta laboriosam praesentium molestiae voluptatem perferendis est tenetur non incidunt facere.",
        "capacity": null,
        "price": 650,
        "featured": 1,
        "img": "1.jpg",
        "vap_id": null,
        "category_id": 1,
        "discount_id": null,
        "created_at": null,
        "updated_at": null,
        "score": 0,
        "is_available": 1,
        "best_seller": 1
    },
    {
        // product 2
    },
    ... and so on
]

Serwer na żywo response.data

{
    "0": {
        "id": 1,
        "name": "Don Julio 70 700ml",
        "description": "",
        "capacity": null,
        "price": 754,
        "featured": 1,
        "img": "1.jpg",
        "vap_id": null,
        "category_id": 1,
        "discount_id": null,
        "created_at": null,
        "updated_at": null,
        "score": 6,
        "is_available": 1,
        "best_seller": 0
    },
    "1": {
        // product data
    },
    "2": {
        // product data
    }
    ... and so on
}

To powoduje, że niektóre problemy przy użyciu metody map. I może powodować więcej kłopotów w przyszłości.

Tak, mógłbym przekształcić obiekt, który pragną, ale nie mogę zrozumieć, co to powoduje, ponieważ moje zaplecze jest takie samo w serwisie na żywo i dev:

public function index()
{
    $products = Product::all()
        ->where('is_available', '=', 1)
        ->toArray();

    return response()->json($products, 200); // encode array of arrays to array of objects
}
0
Fer Toasted 15 kwiecień 2021, 04:17

1 odpowiedź

Najlepsza odpowiedź

Zmień Twoją metodę, a otrzymasz lepszą wydajność i nie ma junky obiektu do tablicy do transformacji obiektu

public function index()
{
    $products = Product::query()
        ->where('is_available', '=', 1)
        ->get();

    return response()->json($products, 200);
}

Twoim problemem jest związane z danymi. Dzwonisz, gdzie () na kolekcji, aby utrzymać filtrowane elementy oryginalne ideesa. Jeśli jeden z usuniętych produktów znajduje się w środku tablicy, skończysz z pominiętym indeksem, który można przetłumaczyć tylko na obiekt w formacie JSON

[ 
    0 => 'first',
    1 => 'second',
    3 => 'fourth', // the third item has been filtered out
]
// will become this to keep the structure as the source.
{
    '0':'first',
    '1':'second',
    '3':'fourth'
}

W lokalnych danych musisz mieć filtrowane elementy na końcu tablicy (czwarty w tym przykładzie), więc kolejność nie jest uszkodzona, a tablica PHP może być przetłumaczona na tablicę JS bez utrzymywania indeksów

0
N69S 15 kwiecień 2021, 01:36