
每个数据表 与数据表进行交互的Model模型映射(实例化模型)
记录中的字段 与模型类的属性映射(给属性贼值,字段名就是属性名)
表中的每个记录 与一个完整的请求实例映射(具体的CURD操作)
记录中的字段
与模型类的属性映射(给属性贼值,字段名就是属性名)
表中的每个记录
与一个完整的请求实例映射(具体的CURD操作)
3.1、定义模型
( 1)定义位置
定义模型的位置,默认是在app目录下面:
(2)命名规则
本身laravel对模型的命名没有严格的要求,一般采用表名(首字母大写).php
比如:Member.php User.php Goods.php
( 3)创建模型
可以使用artisan命令﹔例如创建一个member模型【模型也可分目录管理】
[project] > php artisan make:model Member
(4)定义模型注意事项(重点);
第一︰((必做)定义一个$table属性,值是不要前缀的表名(真实的表名),如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词: protected
第二∶(可选)定义$primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(ModeI:find(n)),在主键字段不是id的时候则需要指定主键。修饰词: protected
第三︰(可选)定义$timestamps属性,值是false,如果不设置false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public修改自动维护的字段类型为intprotected $dateFormat = “U”;
第四∶(可选)定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。格式是一维数组形式,修饰词:protected(当使用模型的create、save方法的时候最好就得写上这个属性),反向指定的属性叫做: $guarded
class Member extends Model{use HasFactory;protected $table = "member";public $timestamps = false;}
3.2 控制器中调用
//laravel 框架自带的方法,两种方案都行
//用户自己写的方法 则需要使用第二种方案
use App\Models\Member;
class MemberController extends Controller
{
public function find()
{
//方法一
$rows = Member::get()->toArray();
dd($rows);
//方法二
$rows = new Member();
$rows->get();
}
}
3.3.模型在控制器中的调用
引入Member模型类﹔
use App\Models\Member;
public function ar(){
$rows = Member::get();
}
模型的使用∶模型在控制器中的使用方式有2种
①直接像使用DB门面一样的操作方式:以调用静态方法为主的形式,该形式下模型不需要实例化,例如:Member:get()等价于DB:table(‘member’) -> get() ;
②实例化模型然后再去使用模型类(普通)
public function ar(){
$member = new Member(); //映射关系1:将表映射到模型
$member->username = "小可爱"; //映射关系2:将字段映射到属性,属性名和字段名一致
$member->password = "123";
$res = $member->save(); //映射关系3:将记录映射到实例
dd($res);
}
两种形式的选择标准:
如果使用的方法都是laravel框架自带的,则任意选择;
如果使用的方法有用户自己在模型中定义的,使用第②种形式。
3.4.数据库操作
1. 添加操作
方式一:(AR模式),使用AR模式必须要实例化模型
public function add()
{
$member = new Member();
$member->username = '小花';
$member->year = '1';
$bool = $member->save();
dd($bool);
}
//在数据库表中没有这两个字段是需要在模型中添加下列代码
public $timestamps = false; //操作表中 created_at updated_at
方法二:(隐性效果)
路由文件
//注册界面
Route::get('add','admin\MemberController@add');
//注册处理界面
Route::post('addAction','admin\MemberController@addAction');
控制器:
public function add()
{
return view('add'); //调用视图
}
public function addAction(Request $request)
{
// $bool = $request->all(); //检查是否拿到发送过来的数据
$bool = Member::create($request->all());
dd($bool); //返回值为一个对象
}
//模板文件:
//指定允许写入的字段,如果没有时间相关字段也需要禁用时间自动更新功能
protected $fillable = ['username','password'];
注意:
a.DB类中的insert方法,在模型中也是可以使用的(其他方法也是如此);
b. insert方法必须要求先排除不写入数据表的字段,模型中的fillable属性对insert不生效,如果不事先排除如“_token”等字段,则会报错;
2. 查询操作
public function find()
{
//默认结果集是一个对象 toArray转换为数组
$nows = Member::find(3)->toArray(); //find(3)等价于where('id',3)
$data = compact('nows');
// dd($data);
return view('find',$data);
}
视图中时间转换有问题:
需要在模型中:
use DateTimeInterface;
/**
* 为数组 / JSON序列化准备一个日期
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
3. 修改数据
注意:在laravel里面如果需要更新数据(ORM模型方式),需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置要更新的数据(对象的属性),最后调用save方法.
public function update()
{
$nows = Member::find(8); //先查询
$nows->username = '6666666666'; //修改需要修改的字段
dd($nows->save());
}
问题:能不能用模型去update呢?
答:可以使用update方法进行更新,也可以使用AR模式的方式进行更新。
上述两种方法都可以实现更新,哪种简单用哪种。
4.删除数据(了解)
注意:在laravel里面如果要删除数据,如果需要使用AR模式删除数据必须先根据主键id查询对应的记录,返回一个模型对象,然后调用模型对象的delete方法即可。
$user = Member::find($id); //先查询需要删除的记录
return $member->delete() ? 'ok' : 'fail'; //再删除 返回值也是布尔值:
总之一句话:在DB::table中能使用的方法,在模型中同样可以使用。
如果不需要自己定义数据处理方法,则可以使用DB或者模型门面。如果需要自己定义一些DB门面中没有的方法,则这些方法就需要定义在模型中,此时就得去使用模型了。
比较常见的使用模型的场景:
a. 可能在数据入表之前需要对数据进行比较的处理步骤,这个时候建议在模型中自定义方法对数据进行处理;
b. 如果需要使用关联模型的话,则必须要定义与使用模型;
5. 软删除(了解)
除了真实删除数据库记录,Eloquent也可以「软删除」模型。软删除的模型并不是真的从数据库中删除了。事实上,是在模型上设置了 deleted_at属性并将其值写入数据库。如果deleted_at值非空,代表这个模型已被软删除。如果要开启模型软删除功能,你需要在模型上使用Illuminate(Database( Eloquent(SoftDeletes trait :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
use SoftDeletes;
}
