1
votes

Laravel ajoute un attribut personnalisé au résultat de la pagination

J'essaye d'ajouter des données dans le résultat de la pagination. Voici le code:

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1,
        "totalData": {
            "accumulated1": 235,
            "accumulated2": 799,
            "accumulated3": 1680,
        },
    }
}

Le résultat est:

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1,
        "totalAmount": "129.84"
    }
}

Je voudrais ajouter le totalAmount dans cet objet paginé.

Ce que j'ai essayé:

{
    "datatable": {
        "current_page": 1,
        "data": {
            "0": {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            },
            "totalAmount": "129.84"
        },
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1
    }
}

Je trouve cette méthode sur Internet mais il semble qu'elle ne fait rien ... Le résultat est exactement comme ci-dessus sans cet attribut .

Une autre méthode que j'ai trouvée est put.

$result->put('totalAmount', $totalAmount);

Cette méthode fonctionne vraiment mais pas comme j'en ai besoin. C'est pour ajouter quelques lignes au résultat car cela ajoute l'attribut à l'intérieur de "data". Cela casse mon code lorsque je transmets ces résultats pour datatable.

$result->appends('totalAmount', $totalAmount);

Comment puis-je le faire ???

J'aimerais ceci: p>

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?custom=value&page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?custom=value&page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 1,
        "total": 1
    }
}

Ou l'étape suivante serait:

// query select and filter
[...]

$totalAmount = $sales->sum('amount');
$result = $sales->paginate($rowsPerPage);
return $result;

Avez-vous de l'aide? Merci.


0 commentaires

3 Réponses :


0
votes

Veuillez essayer uniquement avec

$result->totalAmount = $totalAmount;

Et pour y accéder, utilisez simplement $ result-> totalAmount; .
C'est juste un objet, il ne devrait pas y avoir de problèmes


2 commentaires

Cela fonctionne, mais lorsque le contrôleur renvoie le résultat au format json, l'attribut disparaît: return response () -> json (['datatable' => $ sales], 200);


Donc, lors de la sérialisation, ce champ disparaît?



0
votes

vous devez d'abord créer une ressource pour votre réponse, puis ajouter des métadonnées au résultat comme ceci:

return (new UserCollection(User::all()->load('roles')))
                ->additional(['meta' => [
                    'key' => 'value',
                ]]);

vérifiez ceci


0 commentaires

0
votes

Essayez ceci:

$totalAmount = $sales->sum('amount');
$result = $sales->paginate($rowsPerPage);

$custom = collect(['totalAmount' => $totalAmount]);

$data = $custom->merge($result);


0 commentaires