Eloquent-ORM中新增数据、自定义时间戳及批量赋值
通过模型新增数据(涉及自定义时间戳)
使用模型新增数据
在控制器的方法中,先要得到一个模型,需要new:
$student = new Student();
// 对$student模型进行赋值,$student->name就是设置name列的值
$student->name = 'wubin';
更改$student->age属性值就是设置age列的值
$student->age = 1344;
// 执行save方法将以上设置的数据保存到数据库中
$bool = $student->save();
使用save方法的时候,ORM会默认维护数据表的updated和created字段,所以表中要有含有updated和created字段的列。我本地使用的是updated_at和created_at。
->save()方法返回的是布尔值,true代表插入成功。
取出时间列数据,并格式化
$student = Student::find(1011);
$student->created_at;
比如执行以上语句,会返回表中1011行的数据内容中的created_at列:
返回:2021-06-28 06:13:54。发现并不是时间戳。当我们需要他返回的是时间戳格式的时候,我们需要修改数据库的模型类。在app/Http/Student.php类中添加asDateTime方法:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
// 设置$timestamps变量为false 关闭自动更新时间戳的功能
// 不设置或设置为true 则默认开启 会在插入时,检索数据表
// 表中含有created或updated字段会自动添加时间戳
public $timestamps = true;
// 自动维护时间戳 指定存储到数据库的时间是unix时间
// 在数据表中执行->save会自然添加时间戳
protected function getDateFormat()
{
return time();
}
// 当从数据库中取一列时 返回的是将时间戳格式化好的字符串
protected function asDateTime($value)
{
// 直接返回value就是对返回的时间戳不做任何处理
return $value;
}
}
getDateFormat方法:决定了在存储时,会自动向数据库中的时间字段存储一个时间戳。
当取出的数据是没有格式化的时间戳的时候,可以手动对时间戳进行格式化:
$student = Student::find(1011);
echo date('Y-m-d H:i:s', $student->created_at);
使用模型create方法新增数据(涉及批量赋值)
使用模型的create方法新增数据,需要开启批量赋值
$student = Student::create(
[
'name' => 'lovephp',
'age' => 19
]
);
当直接执行上面语句时,会报错,因为没有开启批量赋值。需要在app/Http/Student.php类中添加支持批量赋值的字段:
// 指定允许批量赋值的字段,在这个变量中,指定可以批量赋值的字段
// 否则create方法不能批量赋值
protected $fillable = ['name', 'age'];
// 指定不允许批量赋值的字段
protected $guarded = [];
设置后,就可以使用create方法正常执行新增数据的操作了。
firstOrCreate
firstOrCreate() 以属性查找用户,若没有则新增并取得新的实例。
$student = Student::firstOrCreate(
['name' => 'php']
);
在表中查找name=php的行,找到的话则返回查找到的实例;若没有找到name=php的行,那么就会在表中新增一行,并返回新增行的实例。
firstOrNew
firstOrNew() 以属性查找用户,若没有则建立新的实例,如果需要保存则调用->save。
$student = Student::firstOrNew(
['name' => 'work']
);
执行完后,如果找到name=work的行,那么就会返回查找到的该行的实例;如果没有找到,那么就会返回该行的实例,注意,它执行完后,不会将返回的实例以及数据存入数据表,如果要存入表中 需要手动执行save
$bool = $student->save();
只有执行完save后,才会将work作为name列的值存入。firstOrCreate的过程=firstOrNew+save()的过程集合。