ChatGPT解决这个技术问题 Extra ChatGPT

Laravel firstOrNew 如何检查它是第一个还是新的?

我正在使用 Laravel 的函数 firstOrNew() 来创建新用户或查找并更新现有用户。

在创建对象之后,我如何知道它之前是否存在或者是否是新对象?

这个想法是这样的:

$user = \App\User::firstOrNew([
    'email' => $userData->getEmail(),
    'name' => $userData->getName(),
]);

if ($user->new) { // some way to check
    // user was created now
} else {
    //user already existed
}
检查 created_at 时间戳
当我使用 firstorNew 时它仍然是空的吗?它不会在数据库上
为什么“它不会在数据库上”?
当您使用 firsOrNew 时,它只会创建模型。当您运行 firstOrCreate 时,它会创建并保存模型

p
patricus

第一个或新()

此函数将返回数据库中的第一条记录,或者实例化一个数据库中尚不存在的新模型实例。因此,如果您想检查实例是从数据库中提取的还是新实例,您可以检查模型上的 exists property(非函数)。

if ($user->exists) {
    // user already exists and was pulled from database.
} else {
    // user created from 'new'; does not exist in database.
}

最初的问题是关于 firstOrNew(),但很多人似乎也是为了 firstOrCreate() 而来到这里的。 firstOrCreate() 不同,需要不同的检查。

第一个或创建()

此函数将返回数据库中的第一条记录,或者在数据库中创建一条新记录并返回该记录。由于数据库中存在新创建的记录,因此您无法检查 exists 属性,因为它在两个实例中都是正确的。但是,您可以检查 wasRecentlyCreated 属性。如果当前模型实例刚刚在数据库中创建,则此属性为 true,如果它已经在数据库中,则为 false。

if ($user->wasRecentlyCreated) {
    // user just created in the database; it didn't exist before.
} else {
    // user already existed and was pulled from database.
}

确保不要使用 $user->exists()。我刚刚犯了那个错误。
这对我不起作用,因为 exists 本质上是说记录存在于数据库中。我真正想知道的是该记录是刚刚插入的,还是在操作之前存在的。此外,返回的新对象实际上并没有我想用来创建数据库记录的数据。 Pengxer/Thomas Kim 的答案正是我想要的。
@verboze 使用 firstOrNew 时,模型不会插入到数据库中。如果要在数据库中查找第一个模型并在不存在的情况下插入新行,则应使用 firstOrCreate。然后,如果您使用 firstOrCreate,您可以调用 wasRecentlyCreated,如果为 true,则模型刚刚在数据库中创建,如果为 false,则它之前存在。
m
mhellmeier

您可以检查您的用户是否是最近创建的。

if ($user->wasRecentlyCreated) {
    // new user
} else {
    // user already exists
}

(来源:来自 this answerThomas Kim


wasRecentlyCreated 仅在 firstOrCreate/updateOrCreate 的上下文中有用,并指示模型是否刚刚在数据库中创建。 firstOrNew 本身不会将任何内容保存到数据库中,也不会设置 wasRecentlyCreated。
OP 要求 firstOrNew,而不是这个
D
Diksha Chaudhary

如果您在当前生命周期中创建了模型,则模型的 wasRecentlyCreated 属性将设置为 true。否则,该属性将设置为 false。

换句话说,假设您有一个用户使用电子邮件 test@yopmail.com

$user = User::firstOrCreate(['email' => 'test@yopmail.com']);
var_dump($user->wasRecentlyCreated);

// 上面将输出 false,因为该条目已经存在,否则为 true。


OP 要求 firstOrNew,而不是这个
N
Nizar El Berjawi

您始终可以检查模型中的 ID(或任何其他唯一主键)。

$user = \App\User::firstOrNew([
    'email' => $userData->getEmail(),
    'name' => $userData->getName(),
]);

if($user->id) {
    // The user exists and was retrieved from the database...
}

if (!$user->id) {
    // The user was not found in the database and a new User model was created...
}

请务必记住,在使用 $user->save() 持久化模型后,您将无法使用 $user->id 检查它是否在数据库中找到。这是因为 Eloquent 在保存新模型后会填充新模型的所有属性。