美文网首页
Eloquent ORM

Eloquent ORM

作者: 爱折腾的傻小子 | 来源:发表于2018-10-29 10:58 被阅读17次
php artisan make:model User             //> 生成User模型
php artisan make:model User --migration //> 生成User模型,并执行迁移
php artisan make:model User -m 

表名
Eloquent默认的规则是:模型类名的复数作为与其对应的表名
自定义表名称:protected table = 'my_tables' (覆盖默认值)
主键
Eloquent默认每张表主键为 id
自定义主键:protected primaryKey = 'my_id'; (覆盖默认值)
主键默认是:自动增长(意味着,主键会被自动转换为int类型)
如果不想主键自动增长,并且使用其他类型:public $incrementing = false (取消默认true自动增长)
Model

//> 设置model连接数据库值(默认.env配置选项)
protected $connection;  
//> 设置当前model操作的数据表(默认model名称复数对应的数据表名)
protected $table; //> 这里不需要加上表前缀
//> 设置当前操作表主键字段名称(默认主键自增id,设置覆盖默认)
protected $primaryKey = 'id';
//> 默认主键自动增长(true:自动增长 | false:取消默认,主键不是自动增长类型)
public $incrementing = true;
//> 自动增长类型(也就是主键默认类型)
protected $keyType = 'int';
//> 默认Eloquent自动管理create_at和updated_at字段(false:取消默认,不在自动管理该字段)
public $timesramps = true;
//> 设置时间戳格式,以及日期被如何存储到数据库中以及模型被序列化为数组或 JSON 时日期的格式
protected $dateFormat = 'U';  //> 表示存储形式以时间戳的形式(如果created_at等时date类型存不到数据库里面去的)
//> 默认pagination分页参数,可以自定设置每页默认数量
protected $perPage = 15;
//> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//> 在Eloquent使用create方法保存一个新的模型时,被使用;
//> $fillable 白名单:允许那些字段可以被赋值(在使用create批量赋值时)
protected $fillable = [];  //> 这两个属性只能二选一
//> $guarded 黑名单:设置那些字段不可以被赋值(在使用create批量赋值时)
protected $guarded = ['*']; //> 这两个属性只能二选一 (如果全部都可以被赋值设置为空数组即可)
//> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//> 当构建JSON API时,经常需要转换模型和关联关系为数组或JSON时,在使用Model模型时被使用:返回数据到前端时,自动执行过滤
protected $hidden = ['age']; //> 返回前端的Json或数组会被过滤掉的字段
protected $visible = ['id'];     //> 定义返回前端数据时,能显示的属性白名单

获取模型数据

//> all() 获取模型中所有的数据 该函数没有参数
$flights = App\Flight::all();
foreach ($flights as $flight) {
    echo $flight->name;
}

数据迭代

 $arr = BmsUsers::where('id','>=','1')        
        ->take(10)->offset(10)        
        ->get(['name','id']);       
$flights = $arr->reject(function ($flight) {
        $flight->name = 'bms';
});
//> 和foreach没有什么大的区别
foreach ($flights as $flight) {
    echo $flight->name;
}

all()和get():获取集合

//> all()函数没有参数
//> get() 可以传递一个数组类型的字段数组
public function get($columns = ['*'])

组块结果集

BmsUsers::where([
    ['id','>=',10],
    ['id','<',60]
])->chunk(20,function ($arr){
    dump($arr);
});
//> cursor() 迭代和foreach/chunk基本一致
dump(BmsUsers::where([
    ['id','>=',10],
    ['id','<',60]
])->cursor());
echo "<hr>";
foreach (BmsUsers::where([
    ['id','>=',10],
    ['id','<',60]
])->cursor() as $arr){
    echo $arr->name,"<br>";
    echo $arr->id,"<br>";
    echo "<hr>";
}

获取单个模型

//> 这里的$id可以传递一个数组,查询多个数据
public function find($id, $columns = ['*']){    
      return $this->where('id', '=', $id)->first($columns);
}
//> first查询的是一条记录
public function first($columns = ['*']){
    return $this->take(1)->get($columns)->first();
}
//> 这里需要的是一个字符串
public function value($column){
    $result = (array) $this->first([$column]);
    return count($result) > 0 ? reset($result) : null;
}

findOrFail()和firstOrFail()

//> findOrFail() 和 find() 函数具有一样的功能
//> 如果查找失败,抛出异常,并渲染视图404
//> firstOrFail() 和 first() 函数使用一样,查找失败也会抛出404异常

聚合函数

//> 忽略字段为null的数据,如果统计的时所有字段,除非这些内容都是null否者不会被忽略
public function count($columns = '*')
//> 统计某个字段的的最小值 max类似
public function min($column)
//> 同某个字段的所有总和
public function sum($column)
//> 统计这个字段的平均值 和 average($colum) 使用一致
public function avg($column)
//> 其实average 就是 avg 的别名

插入/更新模型

//> 在ORM中插入和更新都是 使用save(); 保存数据

插入数据的用法:

更新数据:

//> 在ORM中,更新也是使用的save方法保存数据,只是先要获取数据模型
//> 修改指定的一行数据 save 返回值时 bool 可能存在保存失败时,返回true(可能数model模型中没有主键属性)
//> ORM 模型 使用 update方法保存数据
//> 修改多行数据 使用update方法
//> 返回值:返回更新的总条数 int 类型

:通过Eloquent进行批量更新时,saved和updated模型事件将不会在更新模型时触发。这是因为在进行批量更新时并没有从数据库获取模型。

//> 在使用update更新数据时,不会执行saved和updated模型事件(如果该事件被激活状态)

批量赋值

//> 使用create进行数据的批量赋值,该方法也只能每次插入一条数据。
//> create与save和update方法不同的是:create插入成功后,返回当前插入的Model模型实例(有什么用?我们能得到当前插入数据库的id值)而save和update返回的时bool类型值。
//> 其次:在使用create方法的同时,我们需要设置Model类中定义的属性
protected $fillable = [];  //> 允许插入数据库的字段
protected $guarded = []; //> 不允许插入数据库的字段
//> 上面这两个是互斥的,也就是在使用的时候,只能是其中一个生效。(这是由于ORM模型通过批量赋值进行保护)
firstOrCreate 向数据库中添加一行数据,和create方法使用一致
//> 在添加时,先检查需要添加的数据在数据库中是否存在,如果不存在就添加
并返回当前添加的数据model;如果数据存在,直接返回当前数据在数据库
中的model实例

注意:firstOrcreate()方法:不存在就保存,存在就查阅(需要在Model中设置fillable白名单 保存项字段)

注意:save() 方法 在保存数据时 也是需要设置白名单(设置字段值)
firstOrNew 向数据库中添加一行数据,和create方法使用一致
//> 在添加数据时,会先检查数据是否在数据库中存在,如果不存在,返回当前数据的model模型(注意数据没有保存到数据库中去,需要我们使用save方法持续数据持久化,在这期间我们可以修改数据);如果数据存在,那么会返回当前数据在数据库中的model模型

删除模型:这里的删除不会去管理deleted_at字段

  • 题外:关于ORM操作数据库的事件注册



  • 在使用delete删除一行数据时,需要先获取该数据在数据库Model模型再删除,这是由于delete方法不支持传递删除参数

    • delete每次只能删除一行数据,不能一次删除多行比如
      $de = BmsUsers::find([12,13,14]);
      $de->delete();  //> 这种删除不被允许,是有
      

`* ORM 事件

一个新模型被首次保存的时候 ---> creating 和 created 事件会被触发
如果一个模型已经在数据库中存在并调用save方法,updating和updated时间被触发
不论是创建还是更新saving和save时间都会被触发

观察者:对ORM监听进行分组

相关文章

网友评论

      本文标题:Eloquent ORM

      本文链接:https://www.haomeiwen.com/subject/xsgrmttx.html