【问题标题】:Laravel Eloquent updateOrCreate using pre-populated modelLaravel Eloquent updateOrCreate 使用预填充模型
【发布时间】:2019-02-13 01:09:20
【问题描述】:

在整个代码中,我通过从 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();

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

【问题讨论】:

  • 为什么要插入主键?不应该是AUTO_INCREMENT吗?要检查它是否存在,请像您一样使用find() 函数。然后,您将需要 if-else 条件来完成其余的工作。
  • 为什么两者都需要?我不明白为什么你的第一个代码块是必要的/

标签: php database laravel eloquent


【解决方案1】:

在第二个代码中,您将覆盖$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();

【讨论】:

  • 这就是我想要的。但是我相信你需要这样做: $lead = Lead::firstOrNew(['id' => '123']);
【解决方案2】:

你可以先尝试获取对象:

$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 的情况下动态添加。

【讨论】:

    【解决方案3】:

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

    只需对请求数据使用 updateOrCreate:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多