Laravel firstOrCreate有例外

时间:2015-10-19 16:07:35

标签: php laravel

假设我有一张下表:id |名字|电子邮件| create_date | creator_id

当我使用Laravel的firstOrCreate方法时,它会复制我的记录,因为每次调用都会更改create_date和creator_id参数。有没有办法在检查DB中已存在的记录时忽略这些字段?

伪示例可能如下所示:firstOrCreate(array('name'=>'test', 'email'=>'test@test.com'), $exceptionsArray('create_date', 'creator_id'))

2 个答案:

答案 0 :(得分:3)

firstOrCreate()方法接受一组属性,它基于这些属性中是否存在记录被返回或创建的记录。

例如:

| id | name | created_at           |
| 1  | Joe  | 2015-10-01 01:00:00  |
| 2  | Sam  | 2015-10-01 01:00:00  |
| 3  | Ali  | 2015-10-01 01:00:00  |
| 4  | Tom  | 2015-10-01 01:00:00  |

$user = User::firstOrCreate(['name' => 'Joe']);

// $user = record with id 1

这是现有用户,因为firstOrFail()执行:

User::where('name', 'Joe')->first();

下一个例子:

$user = User::firstOrCreate(['name' => 'Joe', 'created_at' => '2015-10-01 01:00:00']);

// $user = record with id 1

这将返回用户,因为在幕后执行以下查询:

User::where('name', 'Joe')->where('created_at', '2015-10-01 01:00:00')->first();

$user = User::firstOrCreate(['name' => 'Joe', 'created_at' => '2020-10-01 01:00:00']);

// $user = a brand new user, as the created_at time is different

firstOrCreate()方法的作用是检查是否存在包含您传递的属性的记录。

因此,在最后一个例子中,它创建新记录的原因是因为它评估了:

User::where('name', 'Joe')->where('created_at', '2020-10-01 01:00:00')->first();

当然会失败。

简而言之,在使用firstOrCreate时,不要传递created_at属性,因为它始终是动态创建的,在很多情况下,您可能不希望包含creator_id

答案 1 :(得分:1)

我不知道这是否适合您,但您可以在查询中使用exists()方法,如下所示:

if (Model::where('name', '=', 'test')->where('email', '=', 'test@test.com')->exists()) {
    // do something
} else {
    // add new record
}