Laravel口才更新或使用预填充模型创建

时间:2018-09-07 16:43:35

标签: php database laravel eloquent

在整个代码中,我通过从API调用获取数据来填充雄辩的模型。在填充完模型之后,我去保存它,但是有可能它可能存在于数据库中(主ID)。

像这样填充模型似乎很愚蠢:

$lead = new Lead;
$lead->id = '123';
$lead->name = 'Tom';
$lead->address = '121 main st';

然后必须执行此操作才能使用updateOrCreate:

    $lead = Lead::updateOrCreate(
        ['id' => $lead->id],
        [
          'name ' => $lead->name,
          'address ' => $lead->address,
        ]
    );

我也尝试过:

$lead = new Lead;
$lead = Lead::find($place);
$lead->id = '123';
$lead->name = 'Tom';
$lead->address = '121 main st';
$lead->save();

但是,这当然不起作用,因为如果线索不存在,您将返回一个空对象,并且无法从空值创建默认对象。

3 个答案:

答案 0 :(得分:3)

在第二个代码中,您将覆盖$lead。您想要的是firstOrNew()

$lead = Lead::firstOrNew(123);
$lead->name = 'Tom';
$lead->address = '121 main st';
$lead->save();

您也可以尝试使用此方法:

if(!$lead = Lead::find(123)) {
   $lead = new Lead();
   $lead->id = 123;
}
$lead->name = 'Tom';
$lead->address = '121 main st';
$lead->save();

答案 1 :(得分:1)

您可以尝试先获取对象:

$lead = Lead::find($place);

if( is_null($lead) ) {
  $lead = new Lead;
}

$lead->name = 'Tom';
$lead->address = '121 main st';

$lead->save();

$lead->save()在这里适用于新对象和现有对象。

注意::对于新的id,应动态添加Lead

答案 2 :(得分:1)

因此,aynber的解决方案可以正常工作,但是您的逻辑对我来说很奇怪。在运行updateOrCreate之前填充新模型有什么意义?

只需对请求数据使用updateOrCreate:

$lead = Lead::updateOrCreate(
    ['id' => '123'],
    [
      'name ' => 'Tom',
      'address ' => '121 main st',
    ]
);