我有两列的汽车:user_id
和token
我只想在创建时传递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
。
有什么建议吗?
答案 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);
}