Php 模型构造函数中的赋值不起作用
我的车有两列:Php 模型构造函数中的赋值不起作用,php,laravel,laravel-5,Php,Laravel,Laravel 5,我的车有两列:user\u id和token 我只想在创建时传递用户id,并自动创建令牌: $car = Car::create([ 'user_id' => $user->id, ]); 这是我的汽车级别: class Car extends Model { protected $guarded = []; public function __construct() { parent::__construct();
user\u id
和token
我只想在创建时传递用户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);
}
当我创建汽车时,标记
字段被正确插入。但是,user\u id
字段为空
当我删除\u construct()
方法时,就会正确插入用户id
(但是没有ofc令牌)
我不明白为什么构造函数中的赋值会删除用户id
有什么建议吗?与其在构造函数中创建令牌,不如利用它。简而言之,这允许您侦听事件(例如“创建”、“更新”等),并对该事件执行操作。如果用以下内容替换构造函数,则应解决此问题:
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();
}
您将在控制器中创建汽车
模型的实例,然后模型事件将使用您的令牌更新该实例
顺便说一句:由于令牌是随机生成的,并且似乎不依赖于任何其他数据/函数,因此我不认为删除这一行有什么害处:
'token' = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
进入控制器中的
创建
方法。根据您提供的内容,这将是解决所需问题的最简单方法。问题在于您的构造函数没有正确的方法签名
laravel模型中的create
方法创建一个新模型:$model=newstatic($attributes)
设置新模型数据的是$attributes
数组。您需要确保构造函数接受attributes参数并将其传递给父级:
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->token = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
}
将用户id添加到Car类中的$fillable数组中<代码>受保护的$fillable=['user_id']@Bryan,但我已经指定了
保护的
数组。不需要可填充的neAh,我错过了。你说得对。它应该会起作用。你确定$user->id
有值吗?@Bryan是的,它有值。当我从我的模型中删除构造函数时,列user\u id
将为其分配正确的值。我看到了问题。补充了一个答案。希望有帮助。是的,这两个都是有效的解决办法。但我仍然感到困惑,为什么tokes中的赋值会导致user\u id
变为空。老实说,我也是。我不确定在构造函数实现中,模型保存在哪里。分配令牌后,我希望看到类似于$this->save()
的内容。是否有可能构造器实际上正在创建汽车模型的新实例,而不是修改您使用用户id创建的实例?谢谢。您知道create
方法来自类illumina\Database\Eloquent\Mode.php
?我检查了这个类和它的特征,但我找不到它。取决于你的版本。我在模型类的5.1项目中找到了它。不确定更新的版本。我找到了构造函数
,但没有找到模型::create
方法。但我用的是5.6,也许他们改变了。无论如何,这属于另一个问题的范围。谢谢你的帮助。在5.6中,它在生成器中。通过\u调用魔术方法调用: