首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Laravel代码简洁之道和性能优化

经过一番调研之后发现了一个堪称神器的扩展:laravel-upsert 这个 Laravel 扩展为查询构建器和 Eloquent 添加了对 INSERT & UPDATE (UPSERT) 和 INSERT...IGNORE 的支持 先简单说明一下业务场景: 首先表结构设计是:互相喜欢和添加联系人都是双向关系,即入库A B,B A这样成对的双向数据 触发互相喜欢,插入2条双向数据,插入之前校验是否存在,存在不重复添加...如果互相喜欢,则添加双向联系人关系,插入之前校验是否存在,存在则更新type等字段,不存在则插入双向数据 我们通过这个场景能非常好的体会laravel-upsert的强大,不仅减少了代码量,也减少了sql...upsert()插入一个新的用户或更新现有的一个。...该查询将为每个帖子和日期创建一个新记录或增加现有的查看计数器: DB :: table ( 'stats' )-> upsert ( [ [ 'post_id' => 1 , '

5.8K20

通过 Laravel 查询构建器实现简单的增删改查操作

使用查询构建器进行增删改查 接下来,我们开始介绍 Laravel 数据库功能的核心组件 —— 查询构建器(说是核心,是因为 Eloquent 模型的底层也是基于这个查询构建器),日常开发中,我们与数据库的交互基本都是直接或间接通过它来完成的...查询构建器也是基于 DB 门面的,只不过需要调用其提供的 table 方法构建一个基于指定数据表的查询构建器。...查询记录 要查询指定数据表中的所有记录,可以通过以下方式实现: $users = DB::table('users')->get(); 该方法返回的是一个包含所有查询结果的 stdClass 集合:...,无需手动设置参数绑定来规避 SQL 注入攻击,因为 Laravel 底层会帮助我们自动实现参数绑定,所以推荐使用查询构建器进行数据库操作。...上述代码返回的也是包含指定查询结果的 stdClass 集合: 有时候我们可能希望返回查询结果中的第一条记录,这可以通过将 get 方法替换为 first 方法来实现: $user = DB::table

4.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Laravel Eloquent 模型关联关系(下)

    另外,如果访问的是模型实例上的 author() 方法时,返回的不是用户实例了,而是一个关联关系实例,该实例注入了查询构建器,所以你可以在其基础上通过方法链的方式构建查询构建器进行更加复杂的查询,我们以一个一对多的查询为例...: 如果你想进一步过滤出文章标题和评论都包含「Laravel学院」的用户,可以在上述闭包函数中通过查询构建器进一步指定: $users = User::whereHas('posts', function...注:实际开发中为了提高查询性能,我们往往是在 posts 表中冗余提供一个 comments_count 字段,每新增一条评论,该字段值加 1,查询的时候直接取该字段即可,从而提高查询的性能。...,与 save/saveMany 方法不同的是,这两个方法接收的是数组参数: // 插入一条记录 $post->comments()->create([ 'content' => $faker-...对于那些已存在的标签记录,我们可以通过更高效的方法与文章进行关联关系的绑定和解除,这个方法就是 sync,调用该方法时只需传入刚创建/更新后文章的标签对应 ID 值,至于哪些之前不存在的关联需要绑定,哪些存在的关联需要解除

    19.6K30

    通过 Laravel Eloquent 模型实现简单增删改查操作

    ,简单来说,它会构建类与数据表之间的映射关系,从而建立起一个可在编程语言里使用的「虚拟对象数据库」。...下面我们将模型类定义的时候还会强调这一点。 模型类定义 使用模型类之前,需要在数据库有对应的数据表,因为模型类就是数据表在面向对象编程语言中的映射。...获取单条记录 当然,你也可以通过查询构建器的方式在模型类查询中获取单条记录: $user = User::where('name', '学院君')->first(); 返回的结果是一个模型类实例: ?...此外,Eloquent 还为我们提供了一些快捷的插入方法,比如 firstOrCreate 和 firstOrNew,这两个方法都会先尝试通过指定查询条件在数据库中查找对应记录,如果没有找到的话,会创建对应模型类的实例...同样,Eloquent 也为我们提供了快捷的更新方法 updateOrCreate,该方法首先会根据传入参数对模型对应记录进行更新,如果发现对应记录不存在,则会将更新数据作为初始数据插入数据库,并保存(

    8K20

    Laravel学习记录--Model

    详情访问laravel查询构造器 $model->where()->first()//单行查询 ->find(1)//根据主键查询 ->get(...使用渴求式加载,即根据预先需求查询出所有数据 为了验证[渴求式加载]的好处,举下列例子 这里用到了Laravel Debugbar 调试 安装方法可参照我的另一个博客 - - - Laravel...当获取模型记录时,你可能需要根据不存在的关联对结果进行限制,如获取没有电话号码的用户记录,为了实现这个功能你可以使用doesntHave,并传递关联方法 如 public function show...&更新关联模型 Eloquent提供了便捷的方法将新的模型增加至关联中,如你需要为一个Muser模型插入一个新的Phone,这时你无须为Phone手动设置musers属性,直接在关联上使用save方法插入...有时候你需要更新中间表中已经存在的记录,使用updateExistingPivot方法 该方法接受中间记录另一个的外键和一个关联数组进行更新 public function show(){

    13.6K20

    泛微OA地址外发自定义接口、MySQL操作、Laravel入门

    (Insert) 查询构建器还提供了 insert 方法用于插入记录到数据表。...更新(Update) 当然,除了插入记录到数据库,查询构建器还可以通过使用 update 方法更新已有记录。...) ->where('id', 1) ->update(['votes' => 1]); 更新或插入 有时候你可能想要更新数据库中已存在的某条记录,如果对应记录不存在的话,则插入这条记录...在这种场景下,可以使用 updateOrInsert 方法。 该方法接收两个参数:用于查询记录的条件数组和用于更新的列值对数组。...updateOrInsert 方法首先会尝试使用第一个参数的列值对匹配对应的数据库记录,如果记录存在,则通过第二个参数来更新它。

    2K30

    3分钟短文:Laravel模型创建数据条目的2个语法糖

    [img] 本期我们开始讲模型中,如何插入新条目,或者更新既有条目。...代码时间 我们在构建一个hello world页面的时候,已经介绍了如何使用laravel的命令行脚手架创建新的模型文件,以及通过迁移功能创建数据库表。这样就把数据操作衔接起来了。...假如有一个字段 is_admin 用于指定是否 ”超级管理员“,如果在程序内不小心使用数组或者其他方式对其进行了写入,将会造成比较大的麻烦。...新建 or 更新 接着介绍laravel模型的几个语法糖。一个常规的场景,比如在写入数据时,先判断数据库表内是否有该条记录,如果没有就创建,如何有则返回。...firstOrCreate 方法还接收第二个参数,用于指定第一个参数查询语句不成立时,创建数据条目时使用。

    1.9K00

    【Laravel系列4.3】模型Eloquent ORM的使用(一)

    Active Record 中文的意思是活动记录,特点是一个模型类对应数据库中的一个表。...一是在上面的 Modal 类中,我们没有指定表名,但是框架会根据类名映射一个表名出来。规则是将大驼峰变成蛇式命名,比如 MTest 会变成 m_test 。...对于 Laravel 中标准的 Eloquent 模型类来说,每个表都应该有两个字段,一个是 updated_at ,另一个是 created_at ,分别是两个时间戳字段,用于记录数据的创建时间和修改时间...其实所有的表最好都有这两个字段,而且很多后台管理系统中还需要有 创建人 和 修改人 的记录。它们的目的都是为了数据的安全和记录可追溯。...注意看代码中注释的部分,我们用 MTest::insertGetId() 这种形式也是可以插入成功的,只是这种形式是更类似于 查询构造器 的方式了,不太能体现出 ORM 的感觉,所以还是使用实例化对象的方式来操作

    8.9K20

    通过填充器快速填充 Laravel 测试数据

    在 Laravel 框架中,如果想要快速填充测试数据到数据库,可以借助框架提供的填充器功能,通过填充器,我们可以非常方便地为不同数据表快速填充测试数据。...@gmail.com', 'password' => bcrypt('secret'), ]); } 这里我们借助了查询构建器(下一篇教程将介绍)来插入数据,指定用户名和邮箱为长度不大于...这样,我们就编写好了第一个填充器类,接下来,我们可以通过指定填充器类的方式将这条记录插入到数据库: php artisan db:seed --class=UsersTableSeeder 你还可以在...然后运行如下 Artisan 命令即可: php artisan db:seed 这样,就可以在数据表 users 中看到新填充的用户记录了: 当然,我们可以在 UsersTableSeeder 类中定义多条插入语句来一次性插入多条记录...通过模型工厂填充数据 以上编写填充器类填充数据到数据库虽然已经很方便了,但是每次插入一条记录都要编写一条语句或者手动指定插入数据,如果需要填充的测试数据有成千上万条,那不是要崩溃掉。

    10.1K20

    通过 Laravel 查询构建器实现复杂的查询语句

    在上一篇教程中,我们通过查询构建器实现了简单的增删改查操作,而日常开发中,往往会涉及到一些更复杂的查询语句,比如连接查询、子查询、排序、分页、聚合查询等等,这一篇教程我们将围绕这些内容展开探讨。...有时候,我们想要获取的并不是一行或几行记录,而是某个字段的值,你当然你可以查询到一行记录后从结果对象中获取指定字段的值,但是 Laravel 为我们提供了更便捷的语法: $name = '学院君'; $...如果你想要判断某个字段值在数据库中是否存在对应记录,可以通过 exists 方法快速实现: $exists = DB::table('users')->where('name', $name)->exists...null查询 NULL 查询就是判断某个字段是否为空的查询,Laravel 查询构建器为我们提供了 whereNull 方法用于实现该查询: DB::table('users')->whereNull(...分页 日常开发中,另一个常见的查询场景就是分页查询了,在查询构建器中提供了两种方式来进行分页查询。

    30.2K20

    Go 数据存储篇(七):GORM 使用入门

    1、ORM 与 GORM 我们已经成功存储数据到数据表,但是所有操作都要自行编写代码,很多编程语言和框架会引入 ORM 来解决模型类与数据表记录的映射关系,ORM 架起了 SQL 语句和应用程序之间的桥梁...,将模型类和数据表映射起来,将模型类字段和数据表字段建立关联。...典型的 ORM 库比如 Java 中的 Hibernate、Ruby 中的 ActiveRecord、以及 Laravel 中的 Eloquent。...GORM 的功能非常强大,除了基本的基于模型类对数据表进行增删改查之外,还支持定义关联关系、执行数据表迁移、查询链以及很多其他高级特性,并且支持在特定事件发生时(比如插入、更新、删除)触发指定的回调函数...posts 和 comments 表,然后运行这段代码看看结果是否符合预期: 可以看到,数据表的插入和关联查询结果都是正常的。

    3.1K20

    Laravel框架关键技术解析

    多个trait通过逗号分隔,通过use关键字列出多个trait 冲突的解决:如果两个trait都插入了一个同名的方法,若没有明确解决冲突将会产生一个致命错误,使用insteadof操作符来明确指定使用哪一个...4.两个别名:一是容器核心别名,存在Application中的$aliases,另一个是外观别名,定义在app.php配置文件中,程序运行后存储在AliasLoader类实例的$aliases属性中 5...,可以将数据以对象的形式封装使用,程序的编写将变得高效而且结构清晰 3.对于多个表而且表间存在不同的关系时,如果使用不好会严重影响程序的性能 4.创建命令:php artisan make:model...十二、会话 A.Laravel框架中的session机制 1.当客户端访问服务器时,服务器将开启session,检测请求的Cookie中是否携带sessionID,如果携带则使用该sessionID,...3.当返回响应时,将session中的数据存储到相应的位置,以备下一次请求到来时使用并发送sessionID的Cookie。这个过程可以先称为session的关闭阶段。

    12K20

    30分钟用Laravel实现一个博客

    一个用户表 users 一个博客表 blogs 一个评论表 comments 使用 Migration 创建这3张数据表 php aritsan 是laravel内置的命令 你可以直接在控制台输入它,则会在控制台提示你接下来你能输入的命令...编辑这两个迁移文件 create_blogs // 首先类定义中,有两个方法,up()可以理解为正向操作:创建表,而 down()可以理解为回滚操作:删除表。...主要解释一下 migrations 表: 这是一个记录你的迁移文件名称和批次的表。...最后通过它们3个的配合,使用命令刷新了整个数据库并且分别向3张表插入了很多模拟的数据,便于我们开发。 也许你到这里会觉得这还不如你写sql语句。...总结 => 路由定义在浏览器中访问某控制器中某方法的地址,控制器完成一系列操作:如果需要操作数据库,需要调用模型,每一个模型对应一张表。

    7.4K00

    Laravel 模型事件的应用

    Laravel在模型事件中处理起来很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events Laravel 的模型事件有两种方式,...设置dispatchesEvents属性映射事件类 使用观察器来注册事件,这里介绍第二种 新建模型 php artisan make:model Log 到/config/app.php中的providers数组注册(大概如图中) providers 在app目录下新建文件夹Observers存放模型观察器,并新建基类LogBaseServer...并在构造函数构建基本属性(CLI是因为在命令行执行时不存在用户执行) LogBaseServer 新建一个观察器继承基类LogBaseServer(User模型,方法的名字要对应文档中的事件...中的注入两个参数,一个是角色,另一个是attach或者detach返回的数组 PermissionRoleEvent 事件监听器PermissionRoleEventLog也继承基类LogBaseServer

    21010

    laravel 学习之路 数据库操作 Migrations

    迁移通常配合 Laravel 的结构生成器,能更容易的生成应用程序的数据库结构。如果你曾经让一个团队成员在他本地的数据库结构中手动的添加了字段,那么你将面对解决数据库迁移的问题。...--table 和 --create 选项也可用于确定表的名称以及是否在迁移中创建新的数据表。...created_at 和 updated_at 它们的类型是 timestamps laravel 插入和编辑数据的时候会自动通过这两个字段记录操作的日期时间 这我们就发现了 laravel 的又一特点...$table->softDeletes(); 这个方法就是为表增加一个 deleted_at ,laravel 会在删除数据的时候记录操作日期,具体到功能比如 回收站 的功能了,我们可能会删除某些数据,...重命名一个存在的数据库表,请使用 rename 方法: Schema::rename($from, $to); 删除一个存在的数据表,你可以使用 drop 或者 dropIfExists 方法: Schema

    2.3K20

    通过 Laravel Eloquent 模型实现批量赋值和软删除

    作为一个成熟的 ORM 框架,Eloquent 在设计之初肯定不会没有考虑到这样的问题,实际上,我们可以借助模型类中的白名单属性或黑名单属性来解决这个困扰。...可以看到,这两个属性是互斥的,只要设置一个属性就可以解决所有问题了,不要同时设置两个属性。...而对于相对稳定或者字段很多的数据表,建议使用黑名单,免去设置字段之苦,但是对于这样的模型类,每次修改数据表结构的时候都要记得维护这个黑名单,看看是否需要变动。...注:所谓物理删除就是彻底删除该记录,逻辑删除只是给这条记录打上一个「已删除」的标记,不再出现在查询结果中,但是并没有真正删除这条记录。...()) { dump('该记录已删除'); } 此时再查询 id=32 的记录,已经不存在了,报 404 异常。

    2.5K10

    被百度严格拷打 62 分钟,汗流浃背!

    换句话说,浅拷贝只是创建一个新的对象,然后将原对象的字段值复制到新对象中,但如果原对象内部有引用类型的字段,只是将引用复制到新对象中,两个对象指向的是同一个引用对象。...堆排序(Heap Sort):通过将待排序元素构建成一个最大堆(或最小堆),然后将堆顶元素与末尾元素交换,再重新调整堆,重复该过程直到排序完成。...一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁(next-key lock 也包含间隙锁)。...当事务 A 还没提交的时候,事务 B 向该表插入一条 id = 4 的新记录,这时会判断到插入的位置已经被事务 A 加了间隙锁,于是事物 B 会生成一个插入意向锁,然后将锁的状态设置为等待状态,此时事务...分析查询语句:使用EXPLAIN命令分析SQL执行计划,找出慢查询的原因,比如是否使用了全表扫描,是否存在索引未被利用的情况等,并根据相应情况对索引进行适当修改。

    45910

    2022PHP面试题总结笔记

    laravel中间件做什么? HTTP 中间件是一种用于过滤 HTTP 请求的技术。 Laravel 包含一个中间件,用于检查应用程序用户是否已通过身份验证。...4、mysql左连接右连接(查询两张表不同的数据)区别?...left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 ; right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录; inner join(等值连接...路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”...要求在页面间传递一个验证字符串, 在生成页面的时候 随机产生一个字符串, 做为一个必须参数在所有连接中传递。同时将这个字符串保存在session中。

    89130
    领券