【发布时间】:2022-01-05 01:00:09
【问题描述】:
我有一个表,其中包含“name”、“surname”、“user_id”等列,我需要先通过 id 检查条目是否存在,然后通过 name 和 surname 一起检查,如果没有,则创建它。我如何巧妙地做到这一点,而不是制作两个更新语句,如果两个都返回 0 就创建一个新的(看起来太笨重)
我想用firstOrNew,但似乎只有在匹配所有参数的情况下才能工作。 有没有什么方法可以很好地适用于我的情况?
【问题讨论】:
我有一个表,其中包含“name”、“surname”、“user_id”等列,我需要先通过 id 检查条目是否存在,然后通过 name 和 surname 一起检查,如果没有,则创建它。我如何巧妙地做到这一点,而不是制作两个更新语句,如果两个都返回 0 就创建一个新的(看起来太笨重)
我想用firstOrNew,但似乎只有在匹配所有参数的情况下才能工作。 有没有什么方法可以很好地适用于我的情况?
【问题讨论】:
你可以尝试这样的事情(假设你想创建一个模型[保存到数据库]):
$attributes = [
'name' => ...,
'surname' => ...,
];
$model = Model::where('id', $id)
->orWhere(fn ($q) => $q->where($attributes))
->firstOr(fn () => Model::create($attributes));
这将通过 id OR name 和 surname 搜索记录。如果没有找到,它将创建一个包含姓名和姓氏的新记录(假设这些属性可以在模型上填写)。
Laravel 8.x Docs - Eloquent - Retrieving Single Models / AggregatesfirstOr
【讨论】: