Laravel模型属性不保存在数据库中

时间:2018-08-23 20:13:14

标签: php laravel eloquent attributes

我在模型中创建了一个伪属性,需要在创建的事件中使用它。

问题是因为该假属性在我的数据库中不存在,所以出现致命错误

<?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'

2 个答案:

答案 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的操作,以防止父级的魔术方法尝试设置数据库中不存在的字段的值。但是其他人可能会认为这是好事还是坏事。