假设我有一张下表: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'))
答案 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
}