首页 文章

Laravel 5创建后的雄辩负载模型属性

提问于
浏览
4

在创建雄辩的模型时:

Model::create(['prop1' => 1, 'prop2' => 2]);

返回的模型将只有 prop1prop2 作为属性,我该怎么做才能急切加载我没有插入数据库的所有其他属性,因为它们是可选的?

EDIT: 为什么需要这个?重命名我的数据库字段:

database

CREATE TABLE `tblCustomer` (
    `pkCustomerID` INT(11) NOT NULL AUTO_INCREMENT,
    `baccount` VARCHAR(400) NULL DEFAULT NULL,
    `fldName` VARCHAR(400) NULL DEFAULT NULL,
    `fldNumRue` VARCHAR(10) NULL DEFAULT NULL,
    ....
    PRIMARY KEY (`pkCustomerID`)
);

customer model

<?php namespace App\Models;

/**
 * Class Customer
 * @package App\Models
 * @property int code
 * @property string name
 * @property string addressno
 */
class Customer extends Model
{
    protected $table = 'tblCustomer';
    protected $primaryKey = 'pkCustomerID';
    public $timestamps = false;

    /**
     * The model's attributes.
     * This is needed as all `visible fields` are mutators, so on insert
     * if a field is omitted, the mutator won't find it and raise an error.
     * @var array
     */
    protected $attributes = [
        'baccount'           => null,
        'fldName'            => null,
        'fldNumRue'          => null,
    ];

    /**
     * The accessors to append to the model's array form.
     * @var array
     */
    protected $appends = [
        'id',
        'code',
        'name',
        'addressno'
    ];

    public function __construct(array $attributes = [])
    {
        // show ONLY mutators
        $this->setVisible($this->appends);

        parent::__construct($attributes);
    }

    public function setAddressnoAttribute($value)
    {
        $this->attributes['fldNumRue'] = $value;
        return $this;
    }

    public function getAddressnoAttribute()
    {
        return $this->attributes['fldNumRue'];
    }
}

问题是,当Laravel将所有内容转换为JSON时,他将解析我的所有mutator:

public function getAddressnoAttribute()
    {
        return $this->attributes['fldNumRue'];
    }

并且因为 $this->attributes['fldNumRue'] 未定义而引发错误ErrorException:未定义的索引...所以我需要一种方法来使用它们的默认值初始化所有属性 .

1 回答

  • 6

    您可以在模型上调用 fresh() 方法 . 它将从数据库重新加载模型并返回它 . 请记住,它返回一个重新加载的对象 - 它不会更新现有的对象 . 您还可以传递应重新加载的关系数组:

    $model = $model->fresh($relations);
    

    您可以考虑从数据库和模型中删除默认值 . 这样您就不需要重新加载模型来获取默认值 .

    你可以通过覆盖模型中的 $attributes 属性并在那里设置默认值来实现:

    class MyModel extends Model {
      protected $attributes = [
        'key' => 'default value'
      ];
    }
    

相关问题