2015-08-21 2 views
4

При создании красноречивых моделей:Laravel 5 свойство красноречивых моделей нагрузки после создания

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

возвращаемый модель будет только иметь prop1 & prop2 как свойства, что я могу сделать, чтобы нетерпеливые нагрузки всех других свойств, которые я гавань» t вставлены в базу данных, потому что они являются необязательными?

EDIT: Зачем мне это нужно? переименовать свои поля базы данных:

база

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`) 
); 

модель клиент

<?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, он будет разбирать все мои мутаторов:

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

и поднять ошибку, так как $this->attributes['fldNumRue'] не определен ErrorException: Undefined index ... Так что мне нужен способ инициализировать все атрибуты с их значениями по умолчанию.

ответ

6

Вы можете позвонить по телефону fresh() метод на вашей модели. Он перезагрузит модель из базы данных и вернет ее. Имейте в виду, что он возвращает перезагруженный объект - он не обновляет существующий. Вы также можете передать массив отношений, которые должны быть перегружены:

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

Вы могли бы рассмотреть вопрос о снятии значений по умолчанию из базы данных и в модели. Таким образом вам не потребуется перезагружать модель, чтобы получить значения по умолчанию.

Вы можете сделать это с помощью переопределения $ атрибутов свойства в модели и седения по умолчанию там:

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

работает большим спасибо! Но разве нет автоматизированного способа получения «новой» версии вставленной модели? – kitensei

+0

Вы можете переопределить метод create в модели (или базовой модели) с помощью этого 'return parent :: create (...) -> refresh()', но это будет полностью неэффективно. –

+0

Вы можете сделать, как предлагает @Jan, но подумайте, действительно ли вам это нужно. Это приведет к дополнительному запросу запроса для каждой вставки. –

Смежные вопросы