2017-07-24 48 views
0

我希望我的Server模型的sid的默认值是每次运行的uniqid()函数。像这样的事情,例如Laravel架构默认值功能

$table->string('sid')->default(uniqid);

我怎样才能实现这个结果?

回答

2

您可以使用事件侦听器在模型上设置sid属性。您可以使用事件侦听器,模型观察器或模型引导函数中的闭包函数来完成此操作。

// app\Models\YourModel.php 

/** 
* Define model event callbacks. 
* 
* @return void 
*/ 
public static function boot() 
{ 
    parent::boot(); 

    static::creating(function ($model) { 
     $model->sid = uniqid(); 
    }); 
} 
+0

我喜欢这种方法最好。不想创建新的事件/侦听器。谢谢! –

0

不幸的是,MySQL需要默认的常量。所以,默认值必须是一个常量,它不能是一个函数或表达式。

唯一的办法就是让田可空,并添加uniqid()而数据库是这样创建记录:

$table->string('sid')->nullable(); 

现在,当您添加记录集siduinqid()

如果你有型号名称为Table,然后

$record = new Table(); 
$record-> ----- 
-------- 
-------- 
$record->sid = uniqid(); 
$record->save(); 

这是您可以实现的方式。

UPDATE

您可以在模型默认值,以及这样的:

protected $attributes = array(
    'sid' => uniqid(), 
); 

希望你能理解。

+0

谢谢!有没有一种方法可以让模型自动在:: create上做到这一点? –

+0

@ThorCorreia我已经更新了我的答案。你可以使用$ attribute属性覆盖来实现。 –

+0

@SagarGautam你不能在类属性的定义中调用函数。请参阅http://phpsadness.com/sad/2 –

0

我认为这是最简单的方法

$table->unique('sid')->index() 
+0

嗨,据我所知,这只是生成一个从1开始的数字......但这对我的应用程序来说并不明智,因为用户将自己输入这些服务器ID,并且加入某人的游戏会很容易。我没有密码保护这些服务器,所以这不好。 –