上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。...调用的这些查询相关的方法最后都会通过 __call转而去调用Eloquent Builder实例的这些方法,Eloquent Builder与底层数据库交互的部分都是依赖Query Builder来实现的...的where方法在接到调用请求后直接把请求转给来Query Builder的 where方法,然后get方法也是先通过Query Builder的 get方法执行查询拿到结果数组后再通过 newFromBuilder...'age' => 28, ... ] 设置好属性新的值之后执行Eloquent Model的save方法就会更新数据库里对应的记录,下面我们看看save方法里的逻辑: abstract class...是在Query Builder的基础上做了进一步封装, Eloquent Builder会把这些CRUD方法的调用转给Query Builder里对应的方法来完成操作,所以在Query Builder里能使用的方法到
* 将范围应用于给定的 Eloquent 查询生成器 * * @param \Illuminate\Database\Eloquent\Builder $builder...public function scopeFlag($query){ return $query->where('flag',1); //状态为上架的书 } 调用本地作用域 直接调用scope...,调用方法也相同,不同的是动态作用域可以通过额外参数指定查询条件,如下查找商品价格>200的记录 在定义动态作用域中 public function scopePrice($query,$price){...在调用save方法向Phone模型插入值 这里Eloquent自动在phones表中添加了uid字段,并插入正确的值 使用saveMany添加多个值 $user = \App\Muser::find...belongsTo或者belongsToMany另一个模型时,如评论(comment)属于一篇文章(Post),有时更新子模型导致父模型时间戳更新非常有用 如当一个Comment模型更新时,你要自动使父模型
(); 更新模型 $flight = App\Flight::find(1); $flight->name = 'New Flight Name'; $flight->save(); 批量更新 App\...* * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) { return...* @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database...处理多对多关联时, save 方法接收中间表数组作为第二个参数: App\User::find(1)->roles()->save($role, ['expires' => $expires]); 访问器和修改器...例如, 你可能想要使用 Laravel 加密器对存储在数据库中的数据进行加密, 并且在 Eloquent 模型中访问时自动进行解密.
the scope to a given Eloquent query builder...$query) { return $query->where('active', 1); } } 使用上述添加的本地约束查询,只需要在查询中使用scope前缀的方法,去掉...function scopeOfType($query, $type) { return $query->where('type', $type); } 调用的时候 $users = App\...Eloquent提供了一些方法可以方便的来实现数据类型之间的转换。...假设我们有一个字段是first_name,当我们尝试去获取first_name的值的时候,getFirstNameAttribute方法将会被自动的调用 <?
,往往也需要发布一个版本 如果测试团队是异地测试,更新包也有公网泄露的风险 我们解决这个问题的方法是: 我们将内网与外网打通,让外部能够访问内网的开发机,异地预览实时的效果 打包好的更新包通过加密上传到服务器...').all(); 另外,model也提供了各个阶段的查询事件,如before save/after save等等 比如通过 model.on('before save'); 可以在数据保存前做最后的处理..., 通过 model.on('after save'); 则是在数据保存后得到对应的事件 同时egg-database也提供了规则的概念(Rule),可以将重复、公共部分的事件处理成规则 比如上面model...这样代码中既不美观也无法做到统一管理,于是我们将这部分重新封装,引入了model的概念 举例,比如需要读写某个管理员的行为权限,在原方法中我们需要这样写 const adminid = 1; const.../get的调用 5.egg-moe-builder egg-moe-builder是一套打包用的cli工具,原理其实很简单,通过调用egg-moe-builder --build命令,builder会将
,我们不做过多的介绍,我们此处来看下,all方法的执行,all在Model中是不存在的,那怎么调用的呢?...都是通过调用Eloquent/Builder来实现的。...(); 上面的步骤就好,save通过之前的分析,会自动更新price。...查询和聚合 Eloquent提供了丰富的查询方式,通过前面的__call方法分析,我们知道,这些最终调用的都是Eloquent/Builder方法,where方法也不例外,where其最简单的形式如下:...,先看数据记录怎么变为Model,此处有几个方法 Model::create新建, Model::hydrate将数据库数据转换为Model 当时遇到的问题有字段对应,另一个是安全问题,具体来说就是怎么知道数组中的
该应用程序能够快速方便地管理和修改开发的设计,使您能够根据需要随时更改业务流程。由于增强了对可重用性的支持,以前开发的逻辑可以在新的设计中快速重用。...Action Scripts可以运行在客户端(无需调用服务器)或服务器端(每次Action Script执行都会到达服务器以获取额外数据)两种模式,仅在Web浏览器中执行的动作脚本通常是对显示的Web页面上的数据进行简单的验证脚本...要确保Action Script是客户端,只能使用执行以下操作的类: 只调用标准JavaScript对象中的方法和函数(例如,Number, String, Array, Date, Math, RegExp...特别是在Oracle数据库上运行查询时,或者在数据类型为date的数据上运行查询时,确定的数据类型可能是无效的,在这种情况下,数据类型应该在脚本中提供,如 var query = Database.Query.Create...("CreatedOn", Database.ParameterType.DateTime); var result = query.Run(); 注册查询Query:因为SQL Server与Oracle
11.3.5.MongoDatabaseFactory使用基于 XML 的元数据注册实例 该mongo命名空间提供了一个方便的方法来创建一个 SimpleMongoClientDbFactory,因为相比于使用...例如,你可以找到方法,如find,findAndModify,findAndReplace,findOne,insert,remove,save,update,和updateMulti。...如果无法转换为,则该值将作为字符串存储在数据库中。...因此无法以这种方式检索文档。对于这些情况,@MongoId提供对实际 id 映射尝试的更多控制。 例 62....(因为它是复杂的并且是 的子类型Contact)。
),灵活性强 高性能,得益于其内存计算能力; 副本集、自动分片特性,提供了高可用及水平扩展能力 MongoDB 的主要对象包括数据库(database)、集合(collection)、文档对象(document...),与关系型数据库的对应关系如下: MySql MongoDB schema database table collection record document column field 与关系型数据库一样...Spring-Data-Mongo 实现了类JPA的接口,通过预定义好的Repository可实现代码方法到数据库操作语句DML的映射。...service层) 对Repository 进行调用,如下: @Service public class BookService { @Autowired private BookRepository...自定义操作 有时候,Repository的方法映射无法较好的满足一些特定场景,比如高级检索、局部更新、覆盖索引查询等等, 此时可以使用框架提供的 MongoTemplate 工具类来完成这些定制。
注意最后边的那个save,有些实践中会把save直接整到UoW里边去,我没有,因为我对UoW的唯一期望就是,管理好事务,不涉及到事务的情况下,应用服务层连UoW的影子都不要出现,有Repository就够了...这里特别说明,可能save放这里并不合适,因为有些orm犯不着必须save才行,在非事务的情况下,比如Dapper,再比如Chloe,所以这里可以更进一步优化或抽象。...; 上述IDbContext是Chloe的数据上下文,用过的应该清楚。...new List()); } } 典型的,继承基类泛型实现获取基本CRUD方法,这里多了一个,是因为这个查询相对复杂,如果实际项目中,没有这种复杂查询,...在此之前,曾拜读过园子中大神们的一些文章,最终得出结论,这玩意儿,没必要深究,只要抓住了Martin老爷子对二者的核心定义,在此基础上按照自己的理解去实践就OK了。
初始化 Eloquent首先要对数据库连接做抽象,于是有了Connection类,内部主要是对PDO的一个封装,但是如果只有Connection的话,一个问题是,我们需要直面sql,于是就有了Builder...,同时会定义一些静态方法,如create,find,save,充当了Row Data Gateway角色,此时的类图如下: 此时新增的Model类直接依赖于Connection和Builder,带来的问题是耦合...use Illuminate\Database\Query\Builder as BaseBuilder; class Builder extends BaseBuilder { /**...此时关系处理上主要的逻辑是调用Model的HasOne等表关系的方法,返回Relation的子类,然后通过Relation来处理进而返回数据,这么说可能有点绕,我们下面具体介绍下每个关系的实现,大家可能就理解了...Model的hasOne方法后,返回是一个HasOne,即Relation,当我们调用Relation的方法时,是怎么处理的呢?
update() 方法是用于更新的,它返回的是受影响的条数,这个方法需要有一个 where() 函数用于提供更新数据的条件,如果不带 where() 的话也是可以的,不过后果自己承担哈。...在这里还需要注意的是,链式调用每个函数方法的返回值哦,只有返回的是 Builder 对象的才可以不停地链式哈,get()、toArray()、find() 之后可不能再继续链式了,因为它们返回的是结果对象...底层真的是调用的原始操作方法? 我们选用最简单的 update() 方法看一下,因为它的代码实在是太明显了。...直接通过编辑器的跳转功能点击 update() 方法就会跳转到 laravel/framework/src/Illuminate/Database/Query/Builder.php 的 update(...这个方法中的每个方法里面都是在拼接我们需要的这条 update 更新语句。
比如说我们可以使用类似于 array_map() 的函数把集合中的对象全部转换成数组,还可以用一个类似于 array_column() 的函数只获取数据中的两个字段组成键值对形式的数据。...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。...但是,这里划重点了,Eloquent\Builder 中有些方法是没有的,比如说 insert()、insertGetId() ,在模型中,使用 save() 就可以代替这两个方法的操作。
\Illuminate\Database\Query\Builder|\App\Post whereTitle($value) * @method static \Illuminate\Database...\Query\Builder|\App\Post whereSlug($value) * @method static \Illuminate\Database\Query\Builder|\App\...\Database\Query\Builder|\App\Post whereViewCount($value) * @method static \Illuminate\Database\Query...\Builder|\App\Post whereFavoriteCount($value) * @method static \Illuminate\Database\Query\Builder|\App...(factory(\App\Post::class)->make()); }); } } //然后php artisan db:seed执行数据填充 但是这种方式效率并不高,因为每一次
引言 上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要的一个方法, 就是数据的删除。删除数据,有物理删除和软删除的区别。 ?...第二步,调用模型对象的delete方法。...::destroy(1); 该方法可以可以用于批量删除传入的指定ID数组的条目: Contact::destroy([1, 5, 7]); 当然了,delete方法只是链式调用的一个方法,我们通过查询构造器过滤后的数据集..., 都可以调用该方法将其删除: Contact::where('updated_at', '>', Carbon::now()->subYear())->delete(); 上面代码实现的是,超过一年没有更新过的...大家注意, 想我们的常规操作一样,就是获取一个时间戳$time, 然后把字段赋值: $this->deleted_at = $time; 最后使用update方法更新模型,并修改数据库条目。
它提供了一套简单而直观的方法来执行数据库查询、插入、更新和删除等操作。 2)轻量级 PetaPoco是一个轻量级的框架,不依赖于复杂的配置和大量的依赖项。...它的核心库非常小巧,对系统资源的消耗也很低,适用于各种规模的项目。 3)高性能 PetaPoco执行数据库操作的速度非常快,与其他ORM框架相比具有较低的性能开销。...5)跨数据库支持 PetaPoco支持多种主流数据库类型,包括SQL Server、MySQL、SQLite、Oracle等,使开发人员能够在不同的数据库平台上进行统一的数据访问操作。...3、PetaPoco使用示例代码 //初始化数据库连接 var db=new PetaPoco.Database("connectionStringName"); //查询单个值 long count...var data = result.Items;//查询返回的数据 // 逐行查询每条记录,一次只从数据库表中取一条数据 foreach (var a in db.Query<ShelfMissionInfo
Builder也只是在PDO基础上封装的一层API集合,Query Builder提供的Fluent API使得不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优美。...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时见。...Builder也只是在PDO基础上封装的一层API集合,Query Builder提供的Fluent API使得不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优美。...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时
开发环境:Laravel5.3 + PHP7 数据库连接器 连接工厂类ConnectionFactory中通过简单工厂方法实例化了MySqlConnection,看下该connection的构造函数:...OK,那Query Builder是如何把书写的api编译成SQL呢?...编译API成SQL 还是以上篇说到的一行简单的fluent api为例: Route::get('/query_builder', function() { // Query Builder...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时见。
使用@Database注解的类应满足以下条件: 是扩展RoomDatabase的抽象类。 在注释中添加与数据库关联的实体列表。 包含具有0个参数且返回使用@Dao注释的类的抽象方法。...Entity:表示数据库中的表。 DAO:包含用于访问数据库的方法。 应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。...*/ //如果是一对多,这里可以写List @Query("select *from cache where `key`=:key") Cache getCache...long rowID = StudentDatabase.getInstance().getCache().save(cache); //返回int,这是删除的行数,更新返回也是int,代表更新的行数...从应用资源预填充 如需从位于应用assets/目录中的任意位置的预封装数据库文件预填充Room数据库,请先从RoomDatabase.Builder对象调用createFromAsset(),然后再调用
的initSearchBarView方法中调用。...设置查询监听,重写onQueryTextSubmit和onQueryTextChange方法。当搜索框文本改变时,通过restartLoaders方法调用LoadManager开启加载数据流程。...query方法通过一系列的查询方法将数据添加到resultSet中,可以看到query方法中获取SQLite数据库实例,IndexDatabaseHelper中初始化数据库,可以看到数据库名为search_index.db...最后通过query方法查询数据。...异步执行performIndexing方法,通过queryIntentContentProviders方法获取ContentProvider,然后根据provider查找数据,更新到数据库中。