Skip to content

Laravel: eloquent post operation for double column doesn't work #7566

@PicassoHouessou

Description

@PicassoHouessou

API Platform version(s) affected: 4.1

Description

Post operation for property of type float fails

How to reproduce

curl -X 'POST' \
  'https://localhost/product/api/tests' \
  -H 'accept: application/ld+json' \
  -H 'Content-Type: application/json' \
  -d '{
  "price": 1.99
}'
<?php
namespace App\Models;

use ApiPlatform\Laravel\Eloquent\Filter\DateFilter;
use ApiPlatform\Laravel\Eloquent\Filter\OrderFilter;
use ApiPlatform\Laravel\Eloquent\Filter\PartialSearchFilter;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use Illuminate\Database\Eloquent\Model;
use Symfony\Component\Serializer\Annotation\Groups;

#[ApiResource(
    operations: [
        new Get,
        new Patch(),
        new Delete(),
        new Post(),
    ]
)]
#[GetCollection(
)]

#[ApiProperty(property: 'id')]
#[ApiProperty(property: 'price')]
/**
 * @mixin IdeHelperProductVariant
 */
class Test extends Model
{

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'price',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */

    protected function casts(): array
    {
        return [
            'price' => 'float',

        ];
    }
}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->id()->primary();
            $table->double('price');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('tests');
    }
};

Additional Context

{
  "@context": "/api/contexts/Error",
  "@id": "/api/errors/500",
  "@type": "Error",
  "trace": [
    {
      "file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
      "line": 576,
      "function": "createForUnexpectedDataType",
      "class": "Symfony\\Component\\Serializer\\Exception\\NotNormalizableValueException",
      "type": "::"
    },
    {
      "file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
      "line": 1315,
      "function": "validateAttributeType",
      "class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
      "line": 1085,
      "function": "createAndValidateAttributeValue",
      "class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
      "line": 530,
      "function": "createAttributeValue",
      "class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php",
      "line": 398,
      "function": "setAttributeValue",
      "class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
      "line": 260,
      "function": "denormalize",
      "class": "Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/serializer/ItemNormalizer.php",
      "line": 76,
      "function": "denormalize",
      "class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/symfony/serializer/Serializer.php",
      "line": 240,
      "function": "denormalize",
      "class": "ApiPlatform\\Serializer\\ItemNormalizer",
      "type": "->"
    },
    {
      "file": "/app/vendor/symfony/serializer/Serializer.php",
      "line": 145,
      "function": "denormalize",
      "class": "Symfony\\Component\\Serializer\\Serializer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/state/Provider/DeserializeProvider.php",
      "line": 103,
      "function": "deserialize",
      "class": "Symfony\\Component\\Serializer\\Serializer",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/JsonApi/State/JsonApiProvider.php",
      "line": 36,
      "function": "provide",
      "class": "ApiPlatform\\State\\Provider\\DeserializeProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/State/ValidateProvider.php",
      "line": 50,
      "function": "provide",
      "class": "ApiPlatform\\Laravel\\JsonApi\\State\\JsonApiProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/state/Provider/SecurityParameterProvider.php",
      "line": 50,
      "function": "provide",
      "class": "ApiPlatform\\Laravel\\State\\ValidateProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/State/ParameterValidatorProvider.php",
      "line": 87,
      "function": "provide",
      "class": "ApiPlatform\\State\\Provider\\SecurityParameterProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/state/Provider/ParameterProvider.php",
      "line": 102,
      "function": "provide",
      "class": "ApiPlatform\\Laravel\\State\\ParameterValidatorProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/State/AccessCheckerProvider.php",
      "line": 45,
      "function": "provide",
      "class": "ApiPlatform\\State\\Provider\\ParameterProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/state/Provider/ContentNegotiationProvider.php",
      "line": 56,
      "function": "provide",
      "class": "ApiPlatform\\Laravel\\State\\AccessCheckerProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/Controller/ApiPlatformController.php",
      "line": 80,
      "function": "provide",
      "class": "ApiPlatform\\State\\Provider\\ContentNegotiationProvider",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
      "line": 54,
      "function": "__invoke",
      "class": "ApiPlatform\\Laravel\\Controller\\ApiPlatformController",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
      "line": 43,
      "function": "callAction",
      "class": "Illuminate\\Routing\\Controller",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
      "line": 265,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\ControllerDispatcher",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
      "line": 211,
      "function": "runController",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 822,
      "function": "run",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "{closure:Illuminate\\Routing\\Router::runRouteWithinStack():821}",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/app/vendor/api-platform/laravel/ApiPlatformMiddleware.php",
      "line": 47,
      "function": "{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "ApiPlatform\\Laravel\\ApiPlatformMiddleware",
      "type": "->"
    },
    {
      "file": "/app/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LaravelLocalizationRoutes.php",
      "line": 21,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Mcamara\\LaravelLocalization\\Middleware\\LaravelLocalizationRoutes",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 137,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 821,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 800,
      "function": "runRouteWithinStack",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 764,
      "function": "runRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 753,
      "function": "dispatchToRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 200,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "/app/vendor/pidc/pidc-common/src/Middleware/LocalizeApi.php",
      "line": 25,
      "function": "{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Pidc\\Common\\Middleware\\LocalizeApi",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
      "line": 21,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
      "line": 31,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
      "line": 21,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
      "line": 51,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php",
      "line": 27,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Http\\Middleware\\ValidatePostSize",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
      "line": 109,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php",
      "line": 61,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Http\\Middleware\\HandleCors",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
      "line": 58,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Http\\Middleware\\TrustProxies",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php",
      "line": 22,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php",
      "line": 26,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 219,
      "function": "handle",
      "class": "Illuminate\\Http\\Middleware\\ValidatePathEncoding",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 137,
      "function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 175,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 144,
      "function": "sendRequestThroughRouter",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Application.php",
      "line": 1220,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "/app/public/index.php",
      "line": 20,
      "function": "handleRequest",
      "class": "Illuminate\\Foundation\\Application",
      "type": "->"
    }
  ],
  "type": "/errors/500",
  "title": "An error occurred",
  "status": 500,
  "detail": "The type of the \"price\" attribute must be \"string\", \"double\" given."
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions