分块结果
如果你需要处理上千条数据库记录,你可以考虑使用 chunk 方法。该方法一次获取结果集的一小块,并将其传递给 闭包 函数进行处理。该方法在 Artisan 命令 编写数千条处理数据的时候非常有用。例如,我们可以将全部 users 表数据切割成一次处理 100 条记录的一小块:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
}
});
你可以通过在 闭包 中返回 false 来终止继续获取分块结果:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
return false;
});
如果要在分块结果时更新数据库记录,则块结果可能会和预计的返回结果不一致。 因此,在分块更新记录时,最好使用 chunkById 方法。 此方法将根据记录的主键自动对结果进行分页:
DB::table('users')->where('active', false)
->chunkById(100, function ($users) {
foreach ($users as $user) {
DB::table('users')
->where('id', $user->id)
->update(['active' => true]);
}
});
参数分组
有时候你需要创建更高级的 where 子句,例如「where exists」或者嵌套的参数分组。 Laravel 的查询构造器也能够处理这些。下面,让我们看一个在括号中进行分组约束的例子:
$users = DB::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();
laravel 的with 方法应用
应用场景:一对多的关联关系中。
作用:是为了避免N+1次的查询数据库, 从而提升查询的性能;
分类model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
/**
* 分类下面的商品
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function goods()
{
return $this->hasMany(Good::class);
}
}
商品model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Good extends Model
{
/**
* 商品所属分类
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function category()
{
return $this->belongsTo(Category::class);
}
}
查询某个分类下的商品方法
public function goods($categoryId)
{
$category = Category::find($categoryId);
$goods = $category->goods;
return $goods;
}
从同一个接口返回分类和属于该分类的商品,此刻就用到了with
public function category($categoryId)
{
$category = Category::with('goods')->find($categoryId);
return $category;
}
查询一个分类下已经上架的商品,用到了with另一方法
public function category($categoryId)
{
$category = Category::with(['goods'=>function($query){
$query->where('is_sale', 1);
}])->find($categoryId);
return $category;
}
|