Laravel笔记

Laravel各种笔记

Posted on 2016-09-08 16:50:00 in Laravel   阅读(4049)

新增数据 使用查询构建器的insert方法即可插入一条/多条数据:

DB::table('users')->insert([
    ['id'=>1,'name'=>'Laravel','email'=>'laravel@test.com','password'=>'123'],
    ['id'=>2,'name'=>'Academy','email'=>'academy@test.com','password'=>'123'],
    ['id'=>3,'name'=>'LaravelAcademy','email'=>'laravel-academy@test.com','password'=>'123']
]);  

执行成功后即可在数据表$users中插入三条记录。有时候,我们需要插入记录后获取自增ID,可以使用insertGetId方法:

$insertId = DB::table('users')->insertGetId(
    ['name'=>'Laravel-Academy','email'=>'laravelacademy@test.com','password'=>'456']
);

更新表记录很简单,使用查询构建器的update方法即可:

$affected = DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);

使用delete方法删除表记录,删除方法和更新方法类似,返回被删除的行数:

$deleted = DB::table('users')->where('id', '>', 3)->delete();

获取所有表记录
使用get方法即可获取一张表的所有记录:

$users = DB::table('users')->get();
dd($users);

获取单条记录
获取单条记录需要在查询基础上加上first方法:

$user = DB::table('users')->where('name','Laravel')->first();
dd($user);

分组块获取数据
如果数据库包含多条数据,则一次性获取会极大影响性能,对应地,我们可以调用chunk方法分组块获取数据:

DB::table('users')->chunk(2,function($users){
    foreach($users as $user){
        // if($user->name=='LaravelAcademy')
            // return false;
        echo $user->name.'<br>';
    }
});

这里我们指定每次取两条记录。注释部分的意思是我们可以设定查询退出条件,当达到该条件时, 查询退出,不再往下执行。

获取单列的值
上述方法获取的查询结果都是对象实例/对象实例数组,有时候,我们只是想简单获取单列的值,
遍历数组获取指定列的值太麻烦,可以使用lists方法获取列值数组:

$users = DB::table('users')->lists('name');
dd($users);

原生表达式
此外,查询构建器还支持原生表达式,我们需要调用DB门面的raw方法来实现:

$users = DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
dd($users);

内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:

$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);

左连接的结果集指定的左表的所有行,
如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
我们使用查询构建器的leftJoin方法进行左连接查询:

$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);

更加复杂的连接查询

很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,
那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:

$users = DB::table('users')->join('posts',function($join){
    $join->on('users.id','=','posts.user_id')
         ->where('posts.id','>',1);
})->get();
dd($users);

where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:

第一个列名,第二个是操作符,第三个是比较值:

$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);

如果操作符为“=”,该语句也可简化为:

$user = DB::table('users')->where('name','Laravel')->get();

排序 查询构建器使用orderBy方法对查询结果进行排序:

$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);

根据代码可以看到orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,asc代表升序,desc代表倒序

分组 为了更好地演示分组,我们给数据表posts新增两个字段:cat_id和views,代表分类ID和浏览数: posts表新增分类ID和浏览数 分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:

$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);

我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:

$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);

注意:having中的条件字段必须出现在select查询字段中,否则会报错。

分页 查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:

$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);

模型 1创建模型 我们使用Artisan命令make:model生成模型类,模型类默认位于app目录下,我们也可以在创建时指定生成目录:

php artisan make:model Models/Post

//获取多个Eloquent模型
 $posts = Post::all();

获取单个模型 可以使用查询构建器方法获取单个模型实例:

$post = Post::where('id',1)->first();
dd($post);

当然也可以通过Eloquent模型类提供的快捷方法find:

$post = Post::find(1);

如果没有找到对应的表记录,会输出null,如果我们想要捕获查询结果为空的异常并进行处理, 比如跳转到404页面,可以使用findOrFail或者firstOrFail方法,如果表记录存在,两者返回获取到的第一条记录 ,否则抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

聚合函数查询 如果要对查询结果进行计数、统计、最大值/最小值、平均数等聚合运算,可以使用查询构建器上的对应方法, 我们我们查询文章总数:

$count = Post::where('id','>',0)->count();
echo $count;

输出结果为3,又或者我们想要获取文章最大阅读数:

$views = Post::where('id','>',0)->max('views');
echo $views;

输出结果为800。

创建模型 使用save方法创建模型 调用Eloquent模型类的save方法即可创建模型并插入数据到数据库:

$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 '添加文章失败!';
}

使用create方法插入数据

$input = [
    'title'=>'test 5',
    'content'=>'test content',
    'cat_id'=>1,
    'views'=>100,
    'user_id'=>2
];
$post = Post::create($input);
dd($post);

其他插入数据的方法 Eloquent模型类还支持其它插入数据的方法——firstOrCreate和firstOrNew

更新模型 使用save方法更新模型

$post = Post::find(1);
$post->title = 'test 1 title';
if($post->save()){
    echo '更新文章成功!';
}else{
    echo '更新文章失败!';
}

删除模型 使用delete删除模型 删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可:

$post = Post::find(5);
if($post->delete()){
    echo '删除文章成功!';
}else{
    echo '删除文章失败!';
}

使用destroy删除模型 当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:

$deleted = Post::destroy(5);

你也可以一次传入多个模型id删除多个模型:

$deleted = Post::destroy([1,2,3,4,5]);

调用destroy方法返回被删除的记录数。 使用查询构建器删除模型 既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:

$deleted = Models\Post::where('views', 0)->delete();

软删除及其相关实现 所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除, 这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态, 这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间, 否则该值为空 软删除恢复 有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法: 恢复单个模型

$post = Post::find(6);
$post->restore();

恢复多个模型

Post::withTrashed()->where('id','>',1)->restore();

恢复所有模型

Post::withTrashed()->restore();

恢复关联查询模型

$post = Post::find(6);
$post->history()->restore();

查询结果包含软删除模型 那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:

$posts = Post::withTrashed()->get();
dd($posts);

强制删除 如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDelete方法:

$post = Post::find(6);
$post->forceDelete();

查询作用域 Eloquent还支持将一些常用的查询封装到模型方法中,方便调用,我们将其称之为“查询作用域”, 实现查询作用域很简单,只需要在模型方法前加上scope前缀即可,比如我们经常需要获取浏览数最高的文章 ,就可以使用该机制实现——在Post中定义一个scopePopular方法:

public function scopePopular($query)
{
    return $query->where('views','>=',100);
}

对应的,我们在控制器中定义测试代码如下:

$posts = Post::popular()->orderBy('views','desc')->get();
foreach ($posts as $post) {
    echo '<'.$post->title.'> '.$post->views.'views<br>';
}

此外,查询作用域还支持动态传入参数,为了测试该方法我们为posts新增一个status字段: 同时在模型类中新增一个scopeStatus方法:

public function scopeStatus($query,$status=1)
{
    return $query->where('status',$status);
}

接下来测试下该方法:

$posts = Post::popular()->status(1)->orderBy('views','desc')->get();
foreach ($posts as $post) {
     echo '<'.$post->title.'> '.$post->views.'views<br>';
}

模型事件 Eloquent 也支持模型事件——当模型被创建、更新或删除的时候触发相应事件,Eloquent目前支持八种事件类型: creating、created、updating、updated、saving、saved、deleting、deleted。 deleting和deleted很好理解,在删除模型时触发,deleting在删除操作前执行,deleted在删除完成后执行。 当创建模型时,依次执行saving、creating、created和saved,同理在更新模型时依次执行saving、updating、 updated和saved。无论是使用批量赋值(create/update)还是直接调用save方法,都会触发对应事件 (前提是注册了相应的模型事件)。 你可以在任何你喜欢的地方注册模型事件,这里我们选择在服务提供者AppServiceProvider的boot方法中注册:

Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(一) 一对一 一对多 多对多 http://laravelacademy.org/post/1095.html