模型【 Eloquent】

什么是模型

这是一个对象关系映射器(ORM),使与数据库的交互变得很愉快。使用 Eloquent 时,每个数据库表都有一个对应的「模型」,用于与该表进行交互。除了从数据库表中检索记录外,Eloquent 模型还允许您从表中插入,更新和删除记录。

需要注意的是模型默认使用类的复数形式来作为表名。比如User的模型,表明为users。
如果表是以 _ 连接的,则需要通过 大驼峰命名 方式来命名模型。例如:表user_infos 的模型名称为 UserInfo。

模型的创建

php artisan make:model User

生成的模型会被安放在 app/Models 目录下。

模型的属性

1.table 表名称
就跟我上面说的一样,模型默认使用用类的复数形式作为表明,所以如果有必要可以指定表名。

protected $table = 'my_tablename';

2.timestamps 时间戳
模型默认相应的数据库表中存在 created_at 和 updated_at 字段。在创建或更新模型时,Eloquent 将自动设置这些字段的值。如果你的表中不存在,可以将它关闭。

public $timestamps = false;

3.primaryKey 主键
模型默认主键为ID。也可以自己指定。

protected $primaryKey = 'your_parmaryKey';

4.fillable 允许放行的字段【可以理解为:白名单】
Product 模型代码:

namespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;class Product extends Model
{use HasFactory;protected $table='product';public $timestamps=false;protected $fillable=['name'];
}




这个属性只有这批量新增的时候才有效。新增单挑无效。

5.guarded 不允许放行字段【可以理解为:黑名单】
和上面的 fillable 一样的效果,只不过一个允许一个不允许。
6.attributes 默认值

新增数据时如果没有指定该字段的值,则会启用默认值。

基本操作

1.新增方法

create   多条
save    单条

注意:
在使用 create 方法之前,你需要在你的模型类上指定一个 fillable 或 guarded 属性。 这些属性是必需的,因为默认情况下,所有 Eloquent 模型都受到保护,免受批量赋值漏洞的影响。
2.修改方法

save
update



3.删除方法


5.查询方法

#get
roduct::where('id','>',2)->get();
#find
Product::find(1);

软删除

在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是
把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢
复。在模型中添加 Illuminate\Database\Eloquent\SoftDeletes 。同时如果你数据表中没有deleted_at【数据类型:datetime】字段,需要把 deleted_at 字段添加到数据表中。

开始删除数据

Product::destroy([2,4]);


查询软删除数据

onlyTrashed 方法 - 只查询软删除的数据;
withTrashed 方法 - 查询包括软删除在内的所有数据;Product::onlyTrashed();

恢复软删除 restore

Product::where('id',4)->restore();


永久删除 forceDelete

$pro=Product::onlyTrashed(2);
$pro->forceDelete();

获取器和修改器

获取器
获取到模型实例后,通过模型实例去获取某个字段的数据时触发获取器。该方法必须为public类型。方法命名规范为:getFieldNameAttribute。

模型:

public function  getSexAttribute($value){if($value==1){return '男';}return '女';
}

控制器:

public function index(){$res=Product::find(4);dump($res->sex);
}

修改器

在修改某个字段数据的时候进行触发。
修改器方法的命名规范为:setFieldNamexAttribute。

public function setSexAttribute($value){if($value=='男'){return $this->attributes['sex']=1;}return $this->attributes['sex']=0;
}
Product::create(["name"=>'修改器',"sex"=>'男']);

事件

创建事件

php artisan make:event 事件名称

该文件会存放在 app/Events 目录下面。

生成监听器

php artisan make:listener 监听器名称

该文件会存放在 app/Listeners 目录下面。

注册:
事件和监听器在创建完毕后,还需要将二者联合起来。我们可以在
EventServiceProvider 服务提供者中进行注册。如下:

protected $listen = [事件名称 => [监听器名称,...],
];

测试:
监听器文件:

激活事件:

访问:

模型事件

触发方式
retrieved 获取到模型实例后触发
creating 插入到数据库前触发
created 插入到数据库后触发
updating 更新到数据库前触发
updated 更新到数据库后触发
saving 保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发)
saved 保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发)
deleting 从数据库删除记录前触发
deleted 从数据库删除记录后触发
restoring 恢复软删除记录前触发
restored 恢复软删除记录后触发

测试:

模型文件:

控制器:


随着业务的增加,监听器越来越多,我们要一一注册实现这样比较麻烦浪费时间。这时候可以考虑用观察者。

观察者

观察者的创建

php artisan make:observer ProductObserver
#创建时与模型进行关联
php artisan make:observer ProductObserver --model=Product

文件默认存放在 App\Observers 目录下

注册
① App\Providers\AppServiceProvider.php

②在模型文件中加入:

protected static function booted(){self::observe(ProductObserver::class);}

上面2种方式都可以完成注册。

测试
观察者文件:

访问【新增数据】:

访问【更新数据】:


这种方法只有更新成功才能触发,受影响行数要大于0.这是我测试的结果,如果有这结论不对还请指出。

模型关联

test_id 与test 表ID的对应关系
test_info 一对一
test_phone 多对一

开始前先确定三个模型对应的表和timestamps;如果没有updated_at这种字段要将timestamps设为false。

protected $table=yourtable;
public $timestamps=false;

一对一

hasOne(related,foreign_key,local_key)

related: 关联的模型

foreign_key:关联模型的key【默认:模型_id】

local_key: 主键 【默认id】

test模型:

public function testinfo(){return $this->hasOne(TestInfo::class,'test_id','id');
}

test控制器:

<?phpnamespace App\Http\Controllers;use App\Models\Product;
use App\Models\Test;
use App\Models\TestInfo;class TestController
{public function Index(){$res=Test::find(1);dump($res->testinfo);}
}


先在test表里查出ID为1的数据,再去test_info中根据模型的关联,查出test_id=1的数据。

在一对一关系中,如果我们需要一次性查询出 10 个 test 并带上对应的testInfo 的话,那么就需要给数据库打 1 + 10 条 SQL,这样性能是很差的。

public function Index(){$res=Test::all();  #查询全部数据foreach($res as $rs){ #遍历取出对应test_info数据$rs->testinfo;}
}


所以我们可以用预加载with 方法来进行查询。

Test::with('TestInfo')->get();


这样一对比性能明显就提上去了。

一对多

test模型:

public function  testphone(){return $this->hasMany(TestPhone::class);}



从上面的图可以看出来查出了3条数据。

Laravel学习-模型相关推荐

  1. php laravel入口文件,Laravel学习教程之从入口到输出过程详解

    php 的 Laravel学习教程之从入口到输出过程详解 本文主要给大家介绍了关于Laravel从入口到输出过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. I. 预备 ...

  2. CUDA上深度学习模型量化的自动化优化

    CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...

  3. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

  4. TVM将深度学习模型编译为WebGL

    TVM将深度学习模型编译为WebGL TVM带有全新的OpenGL / WebGL后端! OpenGL / WebGL后端 TVM已经瞄准了涵盖各种平台的大量后端:CPU,GPU,移动设备等.这次,添 ...

  5. 深度学习模型轻量化(下)

    深度学习模型轻量化(下) 2.4 蒸馏 2.4.1 蒸馏流程 蒸馏本质是student对teacher的拟合,从teacher中汲取养分,学到知识,不仅仅可以用到模型压缩和加速中.蒸馏常见流程如下图所 ...

  6. 深度学习模型训练过程

    深度学习模型训练过程 一.数据准备 基本原则: 1)数据标注前的标签体系设定要合理 2)用于标注的数据集需要无偏.全面.尽可能均衡 3)标注过程要审核 整理数据集 1)将各个标签的数据放于不同的文件夹 ...

  7. C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。

    C++调用Python深度学习模型,包含TensorFlow和PyTorch等构造的模型,然后使用GPU出现问题.包含C++调用Python函数,C++加载模型到GPU,GPU内存占用过大,计算完毕内 ...

  8. 忽悠神经网络指南:教你如何把深度学习模型骗得七荤八素

    知己知彼,无论你是想成为黑客(最好不要!)或防范未来黑客的入侵,都有必要来了解一下如何骗过由海量数据训练出来的深度学习模型. 只要有程序员还在编程,黑客们就会不遗余力地找寻利用这些程序的方法.恶意黑客 ...

  9. 【滴滴专场】深度学习模型优化技术揭秘

    滴滴拥有海量数据以及 AI 推理需求,GPU 在人脸识别.自动驾驶.地图导航等场景大量使用,滴滴云IFX团队针对斯坦福 DAWNBench 榜单的 ImageNet 模型也进行了深入优化,在 NVID ...

最新文章

  1. js数组中indexOf/filter/forEach/map/reduce详解
  2. 周例会会议、汇报框架
  3. lamp怎么使用mysql_我的LAMP实现过程——MySql
  4. Maven指令的生命周期
  5. 基于 Android NDK 的学习之旅-----环境搭建
  6. java中string的方法_java中String的常用方法
  7. Python基础(while循环/赋值运算符)
  8. mongodb数据库的启动和停止
  9. HDU 1730 Northcott Game
  10. quartus仿真文件的编写
  11. java实现pdf转word_Java实现PDF转word
  12. 机器学习算法工程师面试考点汇总
  13. 锂电池技术关键突破:水淹火烧重击短路都不炸!三星看了会沉默,特斯拉蔚来听了要流泪...
  14. php汉字转拼音百家姓版,百家姓详(带拼音).ppt
  15. 浅谈ACL在校园网中的应用
  16. Linux搭建小型服务器——文件共享以及邮件服务器
  17. 考题篇(6.2) 05 ❀ FortiGate ❀ Fortinet 网络安全专家 NSE 4
  18. 浏览器缩放时,页面布局发生变化
  19. Torque引擎系列
  20. Text-to-Table: A New Way of Information Extraction

热门文章

  1. Java 微信公众平台开发(二)——事件推送与被动回复
  2. Python - 集合的交集补集差集并集全集
  3. Ubuntu 18.04安装nodejs(lts版本)
  4. FastAPI 5 - 常用请求及 postman、curl 使用(parameters,x-www-form-urlencoded, raw)
  5. PVN3D 配置过程(适用ubuntu20,适用30系显卡)
  6. 根据字符类型和密码长度随机生成密码
  7. SQL远程连接数据库查询数据,远程调用存储过程
  8. 软件系统设计-10-防御式编程
  9. iOS 内存泄漏排查方法及原因分析
  10. python好就业么_Python语言就业前景怎么样?好吗?