如何创建Laravel Eloquent实体的空实例

时间:2016-07-17 19:46:18

标签: php json rest laravel laravel-5.2

我有Laravel PHP代码:

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

我希望Laravel控制器有一个特殊的方法,它将Contracts实体的空实例作为json对象返回。我们的想法是,Laravels的代码为此实体提供所有必要的默认分配(例如,来自生成器的ID,根据用户首选项的默认价格类型,根据区域的默认货币等),并返回可从Javascript界面​​使用的实体。 Javascript接口稍后将决定是否丢弃此实体是否继续使用此实体并最终使用适当的插入方法或Laravelt REST API保存(插入)它。

问题是 - 如何创建Laravel模型的空实例?例如

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

代码只返回

[]

但我希望有这样的事情:

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

Laravel有可能吗?一种解决方案可能是使用返回空值的原始SQL,然后可以希望Laravel可以将此SQL转换为对象...

2 个答案:

答案 0 :(得分:6)

如果要为实例设置自定义值,

转到您的模型并添加此

    //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'];

更改此代码:

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

到此:

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

如果您的值已修复,则可以在合同模型类

中执行此操作
    //set default attributes
    protected $attributes = array(
            'ID' => 1111, 
            'CONTRACT_DATE' => null,
            'PRICE_TYPE' => '2',
            'AMOUNT' => 0.0
    );

然后您可以使用您的代码返回一个填充了

以上默认值的实例
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);
    } 
}

答案 1 :(得分:1)

我需要对一个奇怪的小技巧做同样的事情。我使用以下代码使用$fillable属性创建一个空的模型实例。

$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());