【发布时间】:2022-01-01 08:55:47
【问题描述】:
运行一些测试,但在模型的某些布尔输入上一直失败。我基本上会运行一个测试,将一个实体提交到数据库,然后将其拉出并确保它们匹配。
当我将布尔值放入模型的 $fillable 属性时,布尔值不断失败。据我了解,您需要将所有预期的输入放在那里。这些布尔属性来自复选框输入。
class Contract extends Model {
use HasFactory;
protected $table = 'contracts';
protected $guarded = ['id'];
protected $casts = [
'is_volunteer' => 'boolean',
'tpp_accepted' => 'boolean',
'is_old_law' => 'boolean'
];
protected $fillable = [
//'is_volunteer',
//'is_old_law',
//'tpp_accepted',
'created_by_user',
'client_db_id',
...
/*
* Turn a check box value into a bool
*/
protected function checkBoxToBoolean($value): bool {
return ( !!$value ) ? true : false;
}
一个复选框的修改器/访问器示例
public function getTppAcceptedAttribute($value): bool {
return (bool) $value;
}
public function setTppAcceptedAttribute($value) {
$this->attributes['tpp_accepted'] = $this->checkBoxToBoolean($value);
}
数据库蓝图 ...
class CreateContractsTable extends Migration {
public function up() {
Schema::create('contracts', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->unsignedBigInteger('created_by_user')->nullable();
$table->boolean('is_volunteer')->default(false);
$table->boolean('is_old_law')->default(false);
$table->boolean('tpp_accepted')->default(false);
...
我用来检查现有模型和数组之间哪些值不同的辅助方法。
/*
* Return changed values
*/
public function getDiff(array $compare): array {
$compareModel = self::make($compare);
$diff = array_diff_assoc($compareModel->attributes, $this->attributes);
foreach(self::getNonInputKeys() as $k)
unset($diff[$k]);
return $diff;
}
我在这里缺少的是将布尔输入放入 $fillable 属性错误/不正确的做法。为什么省略它们时它会起作用。一切正常,除了布尔值哈哈。
【问题讨论】:
-
失败怎么办?您在这里没有显示与使用属性填充模型相关的任何内容......还有为什么您有一个修改器和一个正在转换的属性的访问器? ...您的
checkBoxToBoolean方法正在这样做:bool ? true : false这是多余的,顺便说一句 -
他们总是从模型中出来。我已经得到了 mutators 和 accessors 是一个快点工作该死的解决方案。
-
您没有向我们展示如何使用属性或使用这些属性创建模型实例,所有这些布尔值的默认值是
false所以也许您没有将任何这些属性传递给数据库