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

Posted

技术标签:

【中文标题】如何创建 Laravel Eloquent 实体的空实例【英文标题】:How to create empty instance of Laravel Eloquent entity 【发布时间】:2016-11-20 09:16:22 【问题描述】:

我有 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 对象返回。这个想法是 Laravel 的代码对该实体进行所有必要的默认分配(例如,来自生成器的 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 转换为对象...

【问题讨论】:

【参考方案1】:

如果您想为您的实例设置自定义值,

转到您的模型并添加此

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

【讨论】:

【参考方案2】:

我需要为一个奇怪的小黑客做同样的事情。我使用以下内容创建了一个使用$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());

【讨论】:

以上是关于如何创建 Laravel Eloquent 实体的空实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Eloquent 的情况下创建 Laravel 模型?

Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?

如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合

Laravel eloquent 如何动态创建关系?

如何测试 Laravel 5.4 中的“创建”事件是不是调用了 Eloquent 模型方法?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?