我在模型中创建了一个伪属性,需要在创建的事件中使用它。
问题是因为该假属性在我的数据库中不存在,所以出现致命错误
<?php
class Occupancy extends Eloquent
{
protected $table = 'occupancies';
protected $fillable = array('component_id',
'title' ,
'supplier_conf_number' ,
'sub_product_code',
'occupancy',
'retail',
'cost',
'wholesale',
'pub',
'othertotal',
'othertotalB2B',
'index',
'nbpax',
'onrequest');
protected $isInsurance = false; // <-- this is my fake attribute
public static function boot()
{
if(_B2B && Auth::check() && !defined('_INSURANCE'))
{
$acc = Account::getAccount()->code;
if($acc == "GVQ" || $acc == "VBG")
{
parent::boot();
static::created(function($post) use ($acc)
{
$booking = Booking::get_current_booking();
$ficav = 0;
$ficav = (($post->wholesale + $post->othertotalB2B) * 0.001);
if($acc == "GVQ" && Auth::user()->int_ext || ($booking && $booking->agent_ext != ""))
$ficav = 0;
$post->othertotalB2B += $ficav;
$post->othertotal += 0;
$post->save();
});
}
}
}
}
在创建事件时,应仅将可填充字段插入数据库?
有没有一种方法可以将属性插入数据库?
$occ = new Occupancy;
$occ->component_id = $cid;
$occ->index = 0;
$occ->onrequest = false;
$occ->title = $addon['name'];
$occ->retail = 0;
$occ->wholesale = $opt['prices']['total']['retail'];
$occ->sub_product_code = 0;
$occ->occupancy = 1;
$occ->cost = ($opt['prices']['total']['cost'] - $opt['prices']['total']['othertotal']);
$occ->othertotal = $opt['prices']['total']['othertotal'];
$occ->othertotalB2B = $opt['prices']['total']['othertotal'];
$occ->nbpax= count($param['names']);
$occ->isInsurance = 1; // my fake attribute
$occ->save(); // SQLSTATE[42S22]: Column not found: 1054 Unknown column 'isInsurance' in 'field list'
答案 0 :(得分:2)
将您的财产公开。无法从该类的外部访问受保护的私有属性。
由于它是受保护的,因此从此作用域进行分配时,将设置$attributes['isInsurance']
而不是$isInsurance
:
$occ->isInsurance = 1; // my fake attribute
这是由于Eloquent的属性重载(__set
方法)。
答案 1 :(得分:0)
我知道这是一个古老的话题,但是我想我会分享我的方法,以防其他人有用。
我这样做的方法是将非数据库属性定义为受保护,然后为我的其他属性覆盖__get magic方法,如下所示:
protected $_myVar;
public function __get( $property )
{
switch($property)
{
case 'myVar':
// Do what needs to be done to deliver the result
return $this->_myVar;
break;
default:
return parent::__get($property);
}
}
我不喜欢将类变量声明为公共变量,因为它破坏了封装。在不破坏Authenticatable功能的情况下,向User类添加功能的效果很好。您可以(并且可能应该)执行类似重写__set的操作,以防止父级的魔术方法尝试设置数据库中不存在的字段的值。但是其他人可能会认为这是好事还是坏事。