Connector数据库连接器的闭包外 (就是参数里的 $pdo, 他是一个闭包,具体值在下面和上篇文章中都有提到) 还加载了两个重要的组件 Illuminate\Database\Query\Grammars...\Grammar: SQL语法编译器 和 Illuminate\Database\Query\Processors\Processor: SQL结果处理器。...接下我们到QueryBuilder类文件 \Illuminate\Database\Query\Builder.php里看看它里面的源码 namespace Illuminate\Database\Query...key大家应该都能猜到如果执行select、orderBy等方法,那么这些方法就会把要绑定的值分别append到select和order这些数组里了,这些代码我就不贴在这里了,大家看源码的时候可以自己去看一下...、 wheres属性,那么我们见先来看看这三个属性的编译器: /** * 编译Select * 部分的SQL * @param \Illuminate\Database\Query\Builder
中主要有三件利器:\Illuminate\Database\MysqlConnector;\Illuminate\Database\Query\Grammars\Grammar;\Illuminate\...Database\Query\Processors\Processor,其中\Illuminate\Database\MysqlConnector是在ConnectionFactory中构造出来的并通过...\Database\Query\Grammars\Grammar和\Illuminate\Database\Query\Processors\Processor是在MySqlConnection构造函数中通过...那PDO实例是如何得到的呢?...该Builder还必须装载两个神器:Grammar SQL语法编译器;Processor SQL结果集后置处理器。
可以看到,和原始配置不同的是我们注释掉了原来的 hosts ,然后增加了 read 和 write ,在这两个属性里面可以以数组的形式指定 hosts 。...找到 laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法,可以看到它还有第三个参数。...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...$this->parameterize($record)....SQL 语句,会交给连接,也就是 laravel/framework/src/Illuminate/Database/Connection.php 中的 insert() 方法来执行。
大家可以看到,在代码中我还使用了一个 toArray() 结尾,这样返回的就是一个数组。如果在没有做其它设置的情况下,这个数组里的每一项会是一个 stdClass 对象。...、数组或者是一个 stdClass 了,已经不是可以持续构造的 Builder 对象了。...赶紧去 【PHP设计模式之建造者模式】https://mp.weixin.qq.com/s/AhCLhH3rQAOULdZ2NtSGDw 中复习一下吧,构造器 建造者 这两个名词是可以互换的哦,这下明白为什么今天我们这篇文章和这些功能为什么叫做...注意看我注释掉的第二种多条件的写法,在这里面我使用了 orOn() 和 where() ,大家可以打开测试一下,结果是如下的 SQL 语句。...不过需要注意的是,insert() 返回的是布尔值,表示成功失败,所以在批量插入的时候想要得到所有的插入 ID 就需要用别的方法了。
这个时候可以使用Auth::attempt()函数,这个函数的作用原理是将你传递进去的数组,比如下面: public function checkLogin(Request $request){ $...::attempt()中会去尝试调用该模型,但是其中调用的类类型不是Model!!!...所以你自以为新建好了User.php后,发现会报以下错误: Argument 1 passed to Illuminate\Auth\EloquentUserProvider::validateCredentials...and defined 简单来说就是你传递的参数错误了,以下是错误演示: namespace App\Model; use Illuminate\Database\Eloquent\Model; class...php namespace App; use Illuminate\Auth\Authenticatable; use Illuminate\Database\Eloquent\Model; use Illuminate
那PDO实例是如何得到的呢?...Grammar将会把Query Builder的fluent api编译成SQL,PDO编译执行该SQL语句得到结果集results,Processor将会处理该结果集results。...该Builder还必须装载两个神器:Grammar SQL语法编译器;Processor SQL结果集后置处理器。...通过构造函数知道该MySqlConnection有了三件利器:PDO实例;Grammar SQL语法编译器实例;Processor SQL结果处理器实例。那PDO实例是如何得到的呢?...该Builder还必须装载两个神器:Grammar SQL语法编译器;Processor SQL结果集后置处理器。
,所以讲的错误的地方,恳请大牛们能不吝赐教;或者如果有什么地方是没看懂的,也请提出来,因为可能那地方就是我自己没看懂,所以没讲明白,你提出后我们就可以一起讨论,让我们能共同的进步的。...: 接着,我们看看是怎么使用Blueprint的,下看创建table $grammar = new Illuminate\Database\Schema\Grammars\MySqlGrammar; $...); 此时返回的$statements是一个array,有count($statements)==1,并且$statements[0]为: create table `users` (`id` int...:是前一篇讲的对于Active Record模式中Model的功能,包括了Model、Builder和Relation功能,忘记的可以去看前一篇orm 系列 之 Eloquent演化历程1的内容 Query...*版本的时候,laravel/framework还采用的psr-0规范,所有其目录层级还是src/Illuminate/Database,在这个版本中有个新的目录Capsule,其下面是一个Manager
实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor...$this->columnize($columns); } // Illuminate/Database/Grammar public function columnize...$this->wrapTable($table); } // Illuminate/Database/Grammar public function wrapTable...所以这里可看出Query Builder是在PHP PDO的基础上实现的一层封装,使得用更加面向对象的Fluent API来操作数据库,而不需要写一行SQL语句。...OK, illuminate/database package不仅提供了Query Builder,还提供了Eloquent ORM。
filled 验证的字段在存在时不能为空。 gt:field 验证字段必须大于给定的 field。两个字段必须是相同的类型。字符串、数字、数组和文件都使用 size 进行相同的评估。...gte:field 验证字段必须大于或等于给定的_field_。两个字段必须是相同的类型。字符串、数字、数组和文件都使用 size 进行相同的评估。...integer 验证的字段必须是整数。 {注} 此种验证规则不是验证数据是 “integer” 类型,仅验证字符串或数值包含一个 integer. ip 验证的字段必须是 IP 地址。...lt:field 验证的字段必须小于给定的 field.。这两个字段必须是相同的类型。字符串、数值、数组和文件大小的计算方式与 size 方法进行评估。...lte:field 验证中的字段必须小于或等于给定的 _字段 _。这两个字段必须是相同的类型。字符串、数值、数组和文件大小的计算方式与 size 方法进行评估。
不幸的是官方文档并没有涵盖所有可用的功能,因此,我决定尝试写文档为自己记录一下。以下是基于Laravel 5.4.26,其他版本可能有所不同。...Container实例的方法,但最简单的方法是调用 app()helper方法: $container = app(); 我今天不会描述其他方式,而是我想专注于Container类本身。...类/接口名称,尽管你不能使用类型提示检索它,但必须使用 make()代替: $container->bind('database', MySQLDatabase::class); $db = $container...为什么忽略参数,请参阅PR 上下文绑定 有时候你想在不同的地方使用不同的接口实现,下面是Laravel 文档中的一个例子: $container ->when(PhotoController::...最后 isShared() - 确定给定类型是否是共享单例/实例 isAlias() - 确定给定的字符串是否是已注册的别名 hasMethodBinding() - 确定容器是否具有给定的方法绑定 getBindings
所以这个需求方,可以定义为多态的,说的通俗一点就是通过类型和 ID 来决定对象。不过这里我并没有定义为多态,因为应用里面不会出现需求方不确定类型的场景,还是继续沿用 creator_id。...从上面的需求场景中我们可以看出,被申请的对象可能是团队也可能是项目,也就是被申请对象不确定,和上面的不确定的需求方是等同的;且一个被申请对象可以被不同的需求方申请多次,也就是典型的 一对多多态关联[1]...•申请加入:action = join•申请报销:action = reimburse 管理员审批 同样的,我们也会出现几个疑问: 1.是谁审批的?...换做以前的我,或者现在的大部分人可能会这么来干: ... public function passed(Request $request) { ......上面的内容其实跟 申请事务处理 的设计是一样样的,至于为什么把 通知 单独出来讲主要是为了以下程序的设计。 审批通知列表 在需求方发送申请之后,其对应的管理员的审批列表该如何呈现呢?
大家好,又见面了,我是你们的朋友全栈君。...error infomation: Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation...prepareBindings($bindings), $e 666| ); 667| } 668| Exception trace: 1...\src\Illuminate\Database\Connection.php:458 Please use the argument -v to see more details....如果你是在版本低于 5.7.7 的 MySQL 或者版本低于 10.2.2 的 MariaDB 上创建索引,那你就需要手动配置数据库迁移的默认字符串长度。
此外,Eloquent 默认主键字段是自增的整型数据,这意味着主键将会被自动转化为 int 类型,如果你想要使用非自增或非数字类型主键,必须在对应模型中设置 incrementing 属性为 false...集合 对 Eloquent 中获取多个结果的方法(比如 all 和 get)而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例,Collection...::where('active', 1) - where('destination', 'San Diego') - update(['delayed' = 1]); update 方法要求以数组形式传递键值对参数...Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /** * 应用作用域到给定的...php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 让查询只包含给定类型的用户
但这跟依赖注入有什么关系,真正的依赖注入是不需给方法传递任何参数值,只需要指明方法参数类型,代码自动查找关系依赖自动注入。...instance)) { $this- spliceIntoParameters($parameters, $key, $instance); } } return $parameters; } 通过反射类方法得到类参数数组...至此参数就构造好了,然后最终会被 runController 方法的 call_user_func_array 回调。 总结: 1....依赖注入原理其实就是利用类方法反射,取得参数类型,然后利用容器构造好实例。然后再使用回调函数调起。 2. 注入对象构造函数不能有参数。否则会报错。Missing argument 1 3....依赖注入故然好,但它必须要由 Router 类调起,否则直接用 new方式是无法实现注入的。所以这就为什么只有 Controller 、Job 类才能用这个特性了。
, 这意味着主键将会被自动转化为 int 类型, 如果你想要使用非自增或非数字类型主键, 必须在对应模型中设置 $incrementing 属性为 false , 如果主键不是整型, 还要设置 $keyType...->restore(); $flight->history()->restore(); 本地作用域 /** * 只包含活跃用户的查询作用域 * * @return \Illuminate\Database...')->get(); 动态作用域 /** * 让查询只包含给定类型的用户 * * @param \Illuminate\Database\Eloquent\Builder $query * @param...$books = App\Book::with('author.contacts')->get(); // 渴求式加载指定字段 // 注: 使用这个特性时, id 字段是必须列出的 $users =...反序列化为 PHP 数组 // 设置 options 属性的值时, 给定数组将会自动转化为 JSON 以供存储 'options' => 'array', ];
查询作用域 全局作用域 全局作用域允许你对给定模型的所有查询添加约束。使用全局作用域功能可以为模型的所有操作增加约束。...php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\...Eloquent提供了一些方法可以方便的来实现数据类型之间的转换。...; $user->first_name = 'Sally'; 属性转换 模型的$casts属性提供了一种非常简便的方式转换属性为常见的数据类型,在模型中,使用$casts属性定义一个数组,该数组的key...* * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; } 数组类型的转换时非常有用的
主要也是因为这两个小功能的应用会比较广泛,并且源码实现也非常简单易懂,我就简单的说一下源码大概的位置,大家直接自己看一下就好了。因此,这篇文章也可以看成是本系列教程学习的一个中场休息。...事务 对于数据库来说,事务操作是非常经典而且也很实用的一个技术。具体事务是干什么的我们就不多说了,毕竟这也不是数据库知识普及的文章。在电商、金融类应用中,事务是非常重要的功能,也是必须的能力。...现在,你再回到路由中去测试我们查询的结果,就会发现输出的内容是符合我们预期的数组格式了。...在 Connection 对象的 config 属性中,清晰地记录着我们的 config/database.php 中的配置信息。然后,根据配置名称进行判断就好啦。相信剩下的事情就不用我多说了。...另外还需要注意的一点是,Model 查询的结果如果使用了 toArray() 的话,返回的数据直接就是数组格式的,为什么呢?
function ($value) use ($name) { return $value instanceof $name; }); } 如果输入的是字符串...同时舍弃掉instances[]中已经注册过的名为abstract的service,当然别名数组也别忘了舍弃。...对象,而Container implement ArrayAccess这个Interface,实现对类的属性做数组式访问,所以Container必须实现四个方法: @link http://php.net...' => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'],...\Handler::class ); 最后,就得到一个塞满好几个service的容器了,而未被实例化前是个空Container.整个的Application的实例化过程分析就OK了。
大家好,又见面了,我是全栈君。 简介 Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface)。...例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 Illuminate\Contracts\Mail\Mailer 契约定义了发送电子邮件所需的方法...如果你长期关注类的单一职责,你会注意到使用契约还是 Facades 其实没多少实际意义上的区别。 然而,你可能还是会有几个关于契约的问题。例如,为什么要使用接口?不使用接口会比较复杂吗?...因为我们依赖于一个扩展包的特定缓存类。一旦这个扩展包的 API 被更改了,我们的代码就必须跟着改变。...而契约扩展包不包含任何实现和依赖项,你可以轻松地编写任何给定契约的替代实现,来实现不修改任何关于缓存消费的代码就可以替换缓存实现。
,direction传入的是bool类型,这两者均无法传入恶意参数。...我尝试debug进入where()函数看了看它内部的实现,src/Illuminate/Database/Query/Builder.php: public function where($column...当时的ThinkPHP注入是我在乌云乃至安全圈站稳脚跟的一批漏洞,它开创了使用数组进行框架ORM注入的先河,其影响和其后续类似的漏洞也一直持续到今天。...POST中传入的一个数组,这意味着注入到模板中的变量只是简单的字符串数组,没有任何对象。...,回调函数必须是一个可以被自动创建与初始化的类方法,比如静态方法。
领取专属 10元无门槛券
手把手带您无忧上云