Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。 Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。 Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
View Details1、删除模型 1.1 使用delete删除模型 删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可:
1 2 3 4 5 6 |
$post = Post::find(5); if($post->delete()){ echo '删除文章成功!'; }else{ echo '删除文章失败!'; } |
该方法返回true或false。 1.2 使用destroy删除模型 当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:
1 |
$deleted = Post::destroy(5); |
你也可以一次传入多个模型id删除多个模型:
1 |
$deleted = Post::destroy([1,2,3,4,5]); |
调用destroy方法返回被删除的记录数。 1.3 使用查询构建器删除模型 既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:
1 |
$deleted = Models\Post::where('views', 0)->delete(); |
返回结果为被删除的文章数。 2、软删除及其相关实现 2.1 软删除实现 上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。 所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。 要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; //设置表名 public $table = 'posts'; //设置主键 public $primaryKey = 'id'; //设置日期时间格式 public $dateFormat = 'U'; protected $guarded = ['id','views','user_id','updated_at','created_at']; protected $dates = ['delete_at']; } |
然后对应的数据库posts中添加deleted_at列,我们使用迁移来实现,先执行Artisan命令:
1 |
php artisan make:migration alter_posts_deleted_at --table=posts |
然后编辑生成的PHP文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AlterPostsDeletedAt extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('posts', function (Blueprint $table) { $table->softDeletes(); }); } ...//其它方法 } |
然后运行:
1 |
php artisan migrate |
这样posts中就有了deleted_at列。接下来,我们在控制器中编写测试代码:
1 2 3 4 5 6 7 8 |
$post = Post::find(6); $post->delete(); if($post->trashed()){ echo '软删除成功!'; dd($post); }else{ echo '软删除失败!'; } |
在浏览器中访问http://laravel.app:8000/test,页面输出如下: 当我们再次通过下面这段代码获取所有文章:
1 2 |
$posts = Post::all(); dd($posts); |
已经看不到id为6的文章的身影了。 2.2 查询结果包含软删除模型 那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:
1 2 |
$posts = Post::withTrashed()->get(); dd($posts); |
执行之后页面显示如下: id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:
1 2 |
$posts = Post::onlyTrashed()->get(); dd($posts); |
执行后页面显示结果如下: 2.3 软删除恢复 有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法: 恢复单个模型
1 2 |
$post = Post::find(6); $post->restore(); |
恢复多个模型
1 |
Post::withTrashed()->where('id','>',1)->restore(); |
恢复所有模型
1 |
Post::withTrashed()->restore(); |
恢复关联查询模型
1 2 |
$post = Post::find(6); $post->history()->restore(); |
2.4 强制删除 如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDelete方法:
1 2 |
$post = Post::find(6); $post->forceDelete(); |
查看数据表可以发现id=6的表记录已经被删除,不复存在: 该方法也支持关联模型强制删除,我们后面讲到关联关系的时候再具体说明。 from:http://laravelacademy.org/post/1020.html
View Details1、创建模型 1.1 使用save方法创建模型 调用Eloquent模型类的save方法即可创建模型并插入数据到数据库:
1 2 3 4 5 6 7 8 9 10 |
$post = new Post; $post->title = 'test 4'; $post->content = 'test content'; $post->user_id = 1; $post->cat_id = 1; if($post->save()){ echo '添加文章成功!'; }else{ echo '添加文章失败!'; } |
在浏览器中访问http://laravel.app:8000/test,如果输出内容为:
1 |
添加文章成功! |
则表明插入成功,我们去数据库查看数据,确实新增了一条记录: 1.2 使用create方法插入数据 除此之外还可以使用create方法插入数据,由于该方法中用到了批量赋值(Mass Assignment),所以我们需要在模型类中设置$fillable属性或者$guarded属性,以表明哪些属性可以通过该方法设置,哪些不可以。 开始之前,我们先解释下什么是批量赋值,以及为什么要使用批量赋值。 批量赋值的英文名称是Mass Assignment,所谓的批量赋值是指当我们将一个数组发送到模型类用于创建新的模型实例的时候(通常是表单请求数据),我们可以简单通过如下方式实现:
1 |
$post = Post::create(Input::all()); |
而不是像使用save方法那样一个一个的设置属性值,如果模型属性很多的话,使用save简直是噩梦有木有。 但事物总是相对的,使用批量赋值是很方便,但同时也带来了安全隐患,很多时候模型类的某些属性值不是我们所期望通过批量赋值修改的,比如用户模型有个user_type属性,如果用户通过请求数据将其类型修改为管理员类型,这显然是不允许的,正是基于这一考虑,Eloquent模型类为我们提供了$fillable属性和$guarded属性,我们可以将其分别看作“白名单”和“黑名单”,定义在$fillable中的属性可以通过批量赋值进行赋值,而定义在$guarded中的属性在批量赋值时会被过滤掉。 那么如果我们确实想要修改定义在$guarded中的属性怎么办?答案是使用save方法。 此外需要注意的是$fillable和$guarded方法同时只能定义一个,原因嘛很简单,非黑即白,定义了一个另外一个也就确定了。 可见批量赋值不仅为我们创建模型提供了便利,还避免了安全隐患,提高了系统的安全性。 下面我们来演示一下批量赋值的使用。首先在Post模型中定义$guarded属性如下:
1 |
protected $guarded = ['views','user_id','updated_at','created_at']; |
然后在控制器中实现创建模型实例的逻辑:
1 2 3 4 5 6 7 8 9 |
$input = [ 'title'=>'test 5', 'content'=>'test content', 'cat_id'=>1, 'views'=>100, 'user_id'=>2 ]; $post = Post::create($input); dd($post); |
在浏览器中输入http://laravel.app:8000/test,则页面输出: 可见user_id和views字段都没有插入进去,这正是$guarded发挥了作用,如果要设置这两个值也很简单:
1 2 3 4 5 6 7 8 9 10 11 12 |
$input = [ 'title'=>'test 5', 'content'=>'test content', 'cat_id'=>1, 'views'=>100, 'user_id'=>2 ]; $post = Post::create($input); $post->user_id = 2; $post->views = 100; $post->save(); dd($post); |
对应输出如下: 1.3 其他插入数据的方法 Eloquent模型类还支持其它插入数据的方法——firstOrCreate和firstOrNew,两者都是先通过通过传入属性值在数据库中查找匹配记录,如果没有找到则创建一个新的模型实例,不同之处在于后者不会将数据持久化到数据库,需要调用save方法才行。 2、更新模型 2.1 使用save方法更新模型 save方法还可以用于更新模型,要更新模型数据,先要获取该模型实例,然后修改模型属性,再调用save方法保存即可:
1 2 3 4 5 6 7 |
$post = Post::find(1); $post->title = 'test 1 title'; if($post->save()){ echo '更新文章成功!'; }else{ echo '更新文章失败!'; } |
在浏览器中访问http://laravel.app:8000/test,如果显示:
1 |
更新文章成功! |
则表明数据库对应表记录更新成功: 2.2 使用update方法更新数据 和create相对应的,Eloquent模型类还支持使用update方法更新数据,同样要用到批量赋值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$input = [ 'title'=>'test 6 title', 'content'=>'test content 6', 'cat_id'=>1, 'views'=>200, 'user_id'=>1 ]; $post = Post::find(6); if($post->update($input)){ echo '更新文章成功!'; dd($post); }else{ echo '更新文章失败!'; } |
对应输出为: 可见user_id和views并没有更新。 from:http://laravelacademy.org/post/984.html
View Details