【问题标题】:can't overwrite laravel elequent output's id field无法覆盖 laravel eloquent 输出 id 字段
【发布时间】:2017-08-05 04:28:47
【问题描述】:

我无法在以下代码中覆盖 $user->id:

$followers_list = follow::where('followed_id',$userId['userId'])
            ->get();   

        foreach($followers_list as $follower)
        {
           $user = myuser::find($follower->follower_id);
           echo $user->id;//everything is fine
           $user->id = Crypt::encrypt(['id'=> $user->id]);               
           echo $user->id; //it's zero for all users
           array_push($followers,$user);               
        }

在 laravel eloquent 中防止这种类型转换(整数到字符串)是规则还是什么?

如何将 id 的整数值替换为其加密字符串?

有什么帮助吗?

【问题讨论】:

  • 您应该包括您遇到的错误。无论如何,用户表都有 id 作为主键,所以你不能让它全部相同//it's zero for all users,如果你使用默认的 laravel 迁移,user->id 只能是整数值(不加密)。
  • 我没有错误。我使用的是 laravel 默认迁移,我只想在我的代码中加密 id 而不是在数据库中!@MaulikGangani 查看修改后的代码
  • 在使用 laravel 的默认迁移时设置 ip 而不保存域模型应该不会导致错误。如果保存模型,可以保存为0,否则会报错。

标签: php laravel-5 laravel-eloquent laravel-encryption


【解决方案1】:

laravel 不允许在任何模型上动态更改 PrimaryKey 的数据类型,

我怎么知道?检查YourProject/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:57

现在如果你想做,你可以打电话给$user->setKeyType('string'),然后做你的$user->id = 'hihello';

推荐吗?我不知道!

【讨论】:

  • 如果string 对于加密值不够大,那么您可以使用text
【解决方案2】:

试试这个:

$user->attributes['id'] = Crypt::encrypt(['id'=> $user->id]);

Eloquent 中的 Laravel getter 和 settier 不允许更改某些对象属性。 attributes 对象是对象真实属性的包装器。

【讨论】:

  • 它将给出PHP error: Indirect modification of overloaded property App\User::$attributes has no effect on line 1 并且$user->id 没有变化
  • 是的,我得到了与@MaulikGangani 相同的错误。
猜你喜欢
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2016-08-28
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多