Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 模型构造函数中的赋值不起作用_Php_Laravel_Laravel 5 - Fatal编程技术网

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调用
魔术方法调用: