1.模型(App/Models)
(1)定义:模型类通常都会放在App/Models文件夹中,laravel默认没有这个文件夹,可以手动建,也可以命令创建模型类的时候自动创建,所有模型类都要继承Illuminate\Database\Eloquent\Model
(2)命令:创建一个index模型类 php artisan make:model Models/Index
(3)常用模型属性:
1.protected $table = '表名' //指定对应的数据表
2.protected $primaryKey = '主键' //指定对应表的主键字段名,默认是id
3.public $incrementing = false //如果主键不是自增或不是数字类型的,需要将这个属性设置成false,默认为true,注意,这个属性的修饰符是public
4.protected $keyType = 'string' //如果主键不是整数,则需要加上将这个属性设置成string
5.public $timestamps = false //laravel默认会操作created_at(添加时间)和updated_at(修改时间),如果你的数据表中没有这两个字段的话,就需要把这个属性设置成false,注意,这个属性的修饰符也是public
6.protected $fillable = [] //允许写入的字段,这是个数字索引数组,里面的键值就是允许写入的字段名,这个数组要是空的话,就说明这张表无法通过模型类添加数据
7.protected $guarded = [] //不允许写入的字段,同上,也是个数字索引数组,里面的键值就是不允许写入的字段名,这个数组要是空的话,就说明这张表的所有字段都可以写入
(4)获取多条:get()/all() 用法和DB类一致
参数:无
返回值:对象
写法:$data = IndexModel::get(); || $data = IndexModel::all();
(5)获取一条:first()/find() 用法和DB类一致
find()参数:数字,会默认根据模型类的primaryKey指向的字段作为条件查询(与TP一致)
first()参数:索引数组,first()也可以传入索引数组,数组键值为字段名,表示要查询的字段,不填默认全部查询
写法:$data = IndexModel::find(1); || $data = IndexModel::where('id',1)->first(['username','password']);
(6)分块查询:chunk() 用法和DB类一致
参数:一参是数字,代表一块有多少条,二参为回调函数,回调函数的参数是当前块的数据,可以在回调函数中对当前块的数据进行处理
写法:$data = IndexModel::chunk(100,function ($query) { foreach ($query as $v) {...} });
(7)游标查询:cursor() 使用游标的方式查询数据库,获取的结果循环出来和正常的get()获取没有区别,但是它在处理大量数据时可以大大减少内存使用量
参数:无
写法:$data = IndexModel::cursor();
(8)findOr():表示单条获取或者…
参数:参数是匿名函数,表示如果没查询到的话可以在匿名函数中做其他操作
写法:$data = IndexModel::findOr(function () {...});
(9)findOrFail:在未找到模型时抛出异常
参数:数字,与find相同
写法:$data = IndexModel::findOrFail(1);
注:find和findOrFail都可以搭配where条件
(10)新增:
同TP一样,新增也需要先实例化对象,但是laravel中的新增流程是先实例化对象,然后给对象设置属性,然后调用save方法
避坑:假如说你的表中有如下字段username,password这两个,那么就需要这样写:$obj = new IndexModel();
$obj->username = $data['username']; //$data就是你表单提交过来的需要新增的数据数组
$obj->password = $data['password'];
$obj->save();
这种写法可以应付字段少的时候,但大多数数据表中的字段都很多,所以这种方法并不方便,所以当字段比较多的时候可以这样写:$obj = new IndexModel();
$obj->fill($data)->save();
静态新增:create();
参数:一维数组,键名为你要插入的字段名,键值为要插入的值(说白了就是表单提交的数据)
写法:$rt = IndexModel::create($data);
返回值:对象(当前模型)
注:执行新增修改时都要去设置$fillable或$guarded,两个不能同时设置。新增会自动操作created_at和updated_at,如果不需要新增时间和修改时间字段,则必须将$timestamps属性设置成false
查找并新增1:firstOrCreate(),去查找指定数据,如果数据不存在则新增一条新数据到数据库
参数:一参为一个关联数组,作用是作为查找条件,键名是字段名,键值是字段值,二参也是一个关联数组,键名是要添加的字段名,键值是要添加的值
写法:$data = IndexModel::firstOrCreate(['username'=>'小明'],['username'=>'小明','password'=>'admin']); //意思就是查找一个username是小明的数据,如果没有就插入一个username是小明,password是admin的数据
返回值:对象(当前模型)
查找并新增2:firstOrNew(),同firstOrCreate(),只不过firstOrCreate()如果没有查到则直接像数据库中插入数据,而firstOrNew()则需要save()一下才会将数据插入数据库
(11)更新:
更新用的也是save()方法,流程也同TP一样,需要先获取查询到你要修改的数据,通过返回的对象->fill($data)->save()执行修改
批量更新:update()方法,可以根据条件进行批量更新(满足条件的都会被更新) IndexModel::whereIn('id',[1,2,3,4,5])->update($data);
更新并新增:updateOrCreate(),用法同数据库相同,一参是要查询的条件,二参是如果没有查到则要新增的数据
(12)删除:
可以通过条件删除,也可以find()查询后调用删除方法删除,也可以主键删除
删除模型:通过find()查询到之后调用删除方法
写法:$obj = IndexModel::find(1); $obj->delete();
返回值:true/false
主键删除:通过传入主键进行删除,支持传入多个id进行多条删除
参数:数字或数组,1 || [1,2,3]
写法:IndexModel::destroy(1);
返回值:影响行数
条件删除:where条件删除
写法:$rt = IndexModel::whereIn('id',[1,2,3])->delete();
返回值:影响行数