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

Posted

技术标签:

【中文标题】Laravel firstOrNew 如何检查它是第一个还是新的?【英文标题】:Laravel firstOrNew how to check if it's first or new? 【发布时间】:2015-08-21 14:31:36 【问题描述】:

我正在使用 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 时,它​​会创建并保存模型 【参考方案1】:

firstOrNew()

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

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


最初的问题是关于firstOrNew(),但很多人似乎也是为了firstOrCreate() 而来到这里的。 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,如果是这样,那么模型只是在数据库中创建的,如果是假的,那么它之前就存在了。【参考方案2】:

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

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

(来源:Thomas Kim 来自this answer)

【讨论】:

wasRecentlyCreated 仅在 firstOrCreate/updateOrCreate 的上下文中有用,并指示模型是否刚刚在数据库中创建。 firstOrNew 本身不会将任何内容保存到数据库中,也不会设置 wasRecentlyCreated。【参考方案3】:

您始终可以检查模型中的 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 会在保存新模型后填充新模型的所有属性。

【讨论】:

【参考方案4】:

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

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

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

// 以上将转储为 false,因为此条目已存在,否则为 true。

【讨论】:

以上是关于Laravel firstOrNew 如何检查它是第一个还是新的?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel firstOrNew 与 firstOrCreate 的区别

如何检查路由“URL”是否存在?

Laravel 数据插入

如何检查数据库PHP Laravel中存在的复选框数组值?

Laravel 验证:唯一,当名称相同,但其他字段不同时

Laravel 应用程序密钥 - 它是啥以及它是如何工作的?