How to create empty instance of Laravel Eloquent entity

17,618

Solution 1

If you want to set custom values to your instance,

Go to your model and add this

    //these are the name of the column of contract table that you wanna fill in
    //if ID is an auto increment column remove it!
    protected $fillable = [
    'ID','CONTRACT_DATE','PRICE_TYPE','AMOUNT'];

the change this code:

class Contracts extends Controller
    public function create() {
        $contract = new Contract;
        return json_encode($contract);
    } 
}

to this:

class Contracts extends Controller
    public function create() {
        $contract = new Contract;
        $contract->ID = 1111;
        $contract->CONTRACT_DATE = null;
        $contract->PRICE_TYPE = '2';
        $contract->AMOUNT = 0.0;
        
        //$contract->save();//this line will insert this instance into db
    
        return response()->json($contract);
    } 
}

If your values are fixed, you can do this in your contract model class

    //set default attributes
    protected $attributes = array(
            'ID' => 1111, 
            'CONTRACT_DATE' => null,
            'PRICE_TYPE' => '2',
            'AMOUNT' => 0.0
    );

then you can use your code to return an instance filled with the default values above

class Contracts extends Controller
    public function create() {
        $contract = new Contract;
        /*return json_encode($contract);*/
        //why use laravel response? because it sets other header parameters for you :)
        return response()->json($contract);
    } 
}

Solution 2

I needed to do the same for a weird little hack. I used the below to create an empty model instance using the $fillable attributes.

$quote_request = new QuoteRequest();
$data = array_combine(
    $quote_request->getFillable(),
    array_fill(0, count($quote_request->getFillable()), null)
);
$quote_request->fill($data);
dd($quote_request->toArray());
Share:
17,618
TomR
Author by

TomR

Updated on June 09, 2022

Comments

  • TomR
    TomR almost 2 years

    I have the Laravel PHP code:

    class Contract extends Model
    {
        public $table = "CONTRACTS";
        public $timestamps = false;
        protected $primaryKey = 'ID';
        protected $fillable = array("ID", "CONTRACT_DATE", "PRICE_TYPE", "AMOUNT");
    }
    

    I would like Laravel controller to have special method that returns empty instance of Contracts entity as json object. The idea is that Laravels's code make all the necessary default assignments to this entity (e.g. ID from the generator, default price type according to user preferences, default currency according to region and so on) and returns entity that can be usable from Javascript interface. Javascript interface later will decided whether to discard this entity of whether to continue with this entity and to finally save (insert) it with the appropriate insert method or Laravelt REST API.

    The problem is - how to create empty instance of Laravel model? E.g.

    class Contracts extends Controller
        public function create() {
            $contract = new Contract;
            return json_encode($contract);
        } 
    }
    

    code simply returns

    []
    

    But I would like to have something like this:

    {"ID":1111,
     "CONTRACT_DATE":null,
     "PRICE_TYPE":"2",
     "AMOUNT":0.0}
    

    Is that possible with Laravel. One solution could be use of raw SQL that returns empty values and then one can hope that Laravel can translate this SQL into object...