雄辩的更新或在更新时创建隐藏列

时间:2019-05-07 14:11:57

标签: php laravel laravel-5 eloquent

如果某种条件下表中已有记录,我正在使用updateOrCreate()函数来更新记录。但是,我不想更新包含唯一值的列之一。

我想对此列执行相同的操作,例如created_at正在工作 创建记录值时会将其添加到created_at列中,而在更新时将包含该值。

为防止出现此问题,我从模型中的$fillable中删除了该列名。但是,在这种情况下,它不会向此列添加任何值。

protected $fillable = ['uid', 'channel', 'updated_at'];

$data = [
    'uid' => Helper::generateUid(),
    'channel' => $info['channel'],
    'created_at' => time(),
    'updated_at' => time(),
];

$cond = ['channel' => $info['channel']];

$isAdded = Templates::updateOrCreate($cond, $data);

预期结果 如果已有详细信息,我不想更新uid列。

实际结果 如果没有详细信息,它将为uid列和其他列增加值,如果有详细信息,那么它将更新uid列。

1 个答案:

答案 0 :(得分:1)

您无法使用updateOrCreate方法来做到这一点。您需要更加明确。您可以使用firstOrNew方法来检索或实例化新对象。然后,您可以使用exists属性来确定它是现有对象还是新对象。

$template = Templates::firstOrNew(['channel' => $info['channel']]);

if (!$template->exists) {
    $template->uid = Helper::generateUid();
}

$template->save();

我省略了created_atupdated_at字段,因为它们是由Laravel自动处理的。