模型构造函数中的分配不起作用

时间:2019-05-08 16:36:40

标签: php laravel laravel-5

我有两列的汽车:user_idtoken

我只想在创建时传递user_id并自动创建令牌:

$car = Car::create([
        'user_id' => $user->id,
]);

这是我的汽车课:

class Car extends Model
{
    protected $guarded = [];

    public function __construct()
    {
      parent::__construct();
      $this->token = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
    }

创建汽车时,正确插入了token字段。但是user_id字段为空。

当我删除__construct()方法时,就正确插入了user_id(但随后没有令牌)。

我不明白为什么构造函数中的赋值会删除user_id

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以利用Laravel's model events来代替在构造函数中创建令牌。简而言之,这使您可以侦听事件(例如“创建”,“更新”等),并对该事件执行操作。如果将构造函数替换为以下内容,它将解决此问题:

public static function boot()
{
    self::created(function ($model) {
        $model->update([
            'token' = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
        ]);
    });
    // If you're using the SoftDeletes trait, uncomment this line.
    // static::bootSoftDeletes();
}

您将在控制器中创建Car模型的实例,然后模型事件将使用您的令牌更新该实例。

顺便说一句:由于令牌是随机生成的,并且似乎不依赖于任何其他数据/函数,因此我不认为删除此行有任何可耻之处:

'token' = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);

进入控制器中的create方法。根据您提供的内容,这将是解决所需内容的最简单方法。

答案 1 :(得分:1)

问题在于您的构造函数没有正确的方法签名。

laravel模型中的create方法创建一个新模型:$model = new static($attributes); $attributes数组是在新模型上设置数据的方法。您需要确保您的构造函数采用attributes参数并将其传递给父级:

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
    $this->token = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
}