Kreedz Zhen
Kreedz Zhen

Reputation: 398

Laravel return encrypted id, the id will be overrided with 0

What I am trying to achieve is that I want to return the encrypted id, but the function will change it to 0 instead of the encrypted value. I made a helper function for encrypting the id, pass by reference.

if (! function_exists('encryptID')) {
    /**
     * Generate the URL to a controller action.
     *
     * @param $data
     * @param array $keys
     */
    function encryptID(&$data = [], $keys = [])
    {
        // if(empty($keys)) $keys = ['id'];
        foreach($data as &$aData) {
            foreach ($keys as $aKey){
                if(isset($aData[$aKey])){
                    $aData[$aKey] = encrypt($aData[$aKey]);
                    $aData['_' . $aKey] = encrypt($aData[$aKey]);
                }
            }
        }
    }
}

In the controller


    /**
     * @return mixed
     */
    public function index()
    {
        $tasks = $this->user->tasks()->get();

        encryptID($tasks, ['id']);

        return response()->apiSuccess($tasks);
    }

apiSuccess function:

        Response::macro('apiSuccess', function ($responseData) {
            return Response::json([
                'success' => true,
                'body' => $responseData
            ]);
        });

The result the api returns:

[
        {
            "id": 0,
            "title": "aaa",
            "description": "bbbbbb",
            "created_at": "2019-11-16 04:13:21",
            "updated_at": "2019-11-16 04:13:21",
            "_id": "eyJpdiI6InFweGtISm1jaE9vOFRuZDBuSUt5WVE9PSIsInZhbHVlIjoiOUQzSE1nWTc4MXM2UnRZQ3BScXNCQT09IiwibWFjIjoiNzM1YWU0Y2UwZjdkN2ZmNDM5MmYzYTRhNTI0YTI4ZDdjNTU5N2M1M2E4NWQyZGRiMzI4MzVjNGFiMjUxMmU4NiJ9"
        },
        {
            "id": 0,
            "title": "aaa",
            "description": "bbbbbb",
            "created_at": "2019-11-16 04:14:53",
            "updated_at": "2019-11-16 04:14:53",
            "_id": "eyJpdiI6ImtBeU92cWhuT05FS3NSYXErOCtKWUE9PSIsInZhbHVlIjoiMTRMN2tTV3Q3SGFzVWE0Q2ZOUXJlQT09IiwibWFjIjoiNzZjMThkMzViMDg4ODllNzk3ZTc3MWMzN2FiYzhmZTg2ZGI2MmM2Y2IzOWM5ZGQ4NTJiMDMwMTZjOTBjN2ZlMiJ9"
        }
]

If I change the key = ['title'], it works as expected.

[
        {
            "id": 1,
            "title": "eyJpdiI6Ikc5bjNWc0pmd2Y2b1lvTFo3M25sVlE9PSIsInZhbHVlIjoieEpLRFwvTVUwckZkbjVCVGwrZ3pMMUE9PSIsIm1hYyI6IjA2NTJhYzNjMjBiMzliYmMyYTYxMjU4N2VmOGFhZTVmMGUzZjBhNzdlMTFjYTQ2YTFkNDA0ODVmMTljZmIzZTMifQ==",
            "description": "bbbbbb",
            "created_at": "2019-11-16 04:13:21",
            "updated_at": "2019-11-16 04:13:21",
            "_title": "eyJpdiI6Im5UYXErNFMzQjY3c3lHSzJ3eGJcLzFBPT0iLCJ2YWx1ZSI6ImpLc1dGWThBSUpKMllEb0VyY0RVcjdIZ3Y1OEZUdld1d3dUYmJmXC9wWkZjUWFyWDlqUnNvMVwvRDlDSjU4QkY2MFJtcGYzbFM0alJ0Z0NoQnZrU3pJRGc0cU1ta2lSaEl3VFk0QlZPSXFZTkVIdDd0ZGNKaGVkb3FmV3dOUlJyYlB4OEV0QlM3RXE0aDVYTFlxWGFWYmZ4UVNkUnBsTmo4eDdNSjloRUhSSUxkZEZoR3VMcldvZHJuczRkVWVrS0NOQWVCOXgwRnJFNjZjU2R4b3VWYUZyZUtkc2dtc0xoNFZzejdFcFpuTHBua1BSa2NMblJoZ2VUWnZhakk2UUNoWkNNZGlRTnpHMHZpcDVqMGg2QmNudWc9PSIsIm1hYyI6IjBiM2QyMTNlNDY4ZGEyMjA1MTVlNWZmMWRkY2IzZjU0MzIxYjVhZmQ4MTQ1OGQzYzkxZmMwMWFkYzg5MmQ4NTYifQ=="
        },
        {
            "id": 3,
            "title": "eyJpdiI6IkVIbVBGcWhCanA1UzBPRnZ1S2RXY1E9PSIsInZhbHVlIjoiN2JSWG1nV1B1Z0lFWEJHOVBPaDh5dz09IiwibWFjIjoiYWQwMzA0NmRhZDc4MzEwNTRhZTFhZWI2MThjYzAzZTg2ZWEzOTAyNzhmNTkwNDU3ZTA0ZWIzYjdhOTM3NWFlNSJ9",
            "description": "bbbbbb",
            "created_at": "2019-11-16 04:14:53",
            "updated_at": "2019-11-16 04:14:53",
            "_title": "eyJpdiI6InowVzM4WE9YaGdvZG9kY1Frdm9Jb1E9PSIsInZhbHVlIjoiaUN4UnVNcVVwQVNSSGYxbHFtWHMzeUhUNUJBTytwQXVDaUhqanJ6ZXJJa0NaV01CYzNcLzZKdFJHazdsQzNnSElnWnZIb0lQUzFlZ24zemZCWk54TmRrR0Q4NTlOV04zNnR5ZmptSXR0aWlKVEU0dGNNUFFHc1Q3NU4ybE5lOVZ3V245UTVYdDRWdHRac29XbmluUW9YckdpNzU2WmRGY2luMjVRN0xrRFkrODVTT0lrR1hIaVd2ZDNGak1MWDJwUTczRlwvYVE3RWZ5YVwvdE9BU3pGTjVndlNINlwvbUtGMmRLcU13ZUdHMlVHcUhjcTk2dlNIdVkwZlRXOWh0ZWpBMzdzb29DS2Y1WjF3ZWNFRmJQa205THJBPT0iLCJtYWMiOiJiZGU3ZjMwZmU5Zjk4YTE4MmNjODVhNTI1NWU1MTEyNGQxMDA3YjM5ZjMyM2FiY2VhOTVhZDViZTBkNmZmNzhiIn0="
        }
]

As you can see all ids will be changed to 0, instead of the encrypted value. I am confused, why would that happen. I made a new key "_id" to test if the encryption is successful, it turns out that the encryption works, but somehow reassign the value to id does not work.

Laravel version: 6.2, PHP version: 7.2.

Anyone knows the reason? Thanks!

Upvotes: 0

Views: 749

Answers (1)

lagbox
lagbox

Reputation: 50551

The id field is set as the primary key and 'incrementing'. When you get this attribute it will be cast to an integer because it is 'incrementing' and set as integer by default.

You can set $incrementing = false; on the model to stop this particular cast.

0 === (int) "some string"

Upvotes: 1

Related Questions