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
。
来源
2015-10-19 16:38:19
Amo
谢谢,它是有道理的 –