laravel-mongodb查询作用域:全局作用域与局部作用域

laravel-mongodb查询作用域:全局作用域与局部作用域

【免费下载链接】laravel-mongodb A MongoDB based Eloquent model and Query builder for Laravel (Moloquent) 【免费下载链接】laravel-mongodb 项目地址: https://gitcode.com/gh_mirrors/la/laravel-mongodb

在使用Laravel框架结合MongoDB进行开发时,查询作用域(Query Scopes)是一个强大的功能,它允许你在模型中定义可重用的查询逻辑。本文将详细介绍laravel-mongodb中的全局作用域与局部作用域,帮助你更高效地构建查询。

什么是查询作用域

查询作用域是Laravel Eloquent ORM提供的一种机制,用于封装常用的查询逻辑,使其可以在模型中轻松重用。在laravel-mongodb中,这一功能得到了很好的支持,允许你为MongoDB模型定义全局和局部作用域。

局部作用域

局部作用域允许你定义只在特定模型实例上可用的查询约束。在laravel-mongodb中,你可以通过在模型类中定义以scope开头的方法来创建局部作用域。

例如,在tests/Models/Location.php中,我们可以定义一个局部作用域来查询特定类型的位置:

public function scopeType($query, $type)
{
    return $query->where('type', $type);
}

使用这个局部作用域时,你可以这样调用:

$locations = Location::type('city')->get();

全局作用域

全局作用域会自动应用到模型的所有查询中。这对于需要在所有查询中添加特定约束的场景非常有用,比如软删除功能。

在laravel-mongodb中,你可以通过实现Illuminate\Database\Eloquent\Scope接口来创建全局作用域,并在模型的boot方法中注册。

例如,在src/Eloquent/SoftDeletes.php中,定义了软删除的全局作用域:

protected static function bootSoftDeletes()
{
    static::addGlobalScope(new SoftDeletingScope);
}

这个全局作用域会自动将whereNull('deleted_at')条件添加到所有查询中,实现软删除功能。

如何定义和使用局部作用域

定义局部作用域

在laravel-mongodb模型中定义局部作用域非常简单,只需创建一个以scope开头的方法,该方法接受一个查询构建器实例作为参数。

以下是一个在tests/Models/Book.php中定义的局部作用域示例:

public function scopePopular($query)
{
    return $query->where('rating', '>', 4.5);
}

使用局部作用域

定义好局部作用域后,你可以在查询模型时直接调用该方法(注意调用时不需要加scope前缀):

$popularBooks = Book::popular()->get();

你还可以链式调用多个作用域:

$recentPopularBooks = Book::popular()->where('published_at', '>=', now()->subYear())->get();

如何定义和使用全局作用域

定义全局作用域

全局作用域需要实现Illuminate\Database\Eloquent\Scope接口,该接口定义了一个apply方法。

以下是一个简单的全局作用域示例:

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', true);
    }
}

注册全局作用域

定义好全局作用域后,需要在模型的boot方法中注册:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new ActiveScope);
}

在laravel-mongodb中,软删除功能就是通过全局作用域实现的,具体实现可以参考src/Eloquent/SoftDeletes.php

移除全局作用域

有时你可能需要在特定查询中移除全局作用域,可以使用withoutGlobalScope方法:

$allUsers = User::withoutGlobalScope(ActiveScope::class)->get();

如果你需要移除所有全局作用域,可以使用withoutGlobalScopes方法:

$allUsers = User::withoutGlobalScopes()->get();

实际应用示例

局部作用域示例

tests/Models/Label.php中,我们可以定义一个局部作用域来查询特定颜色的标签:

public function scopeColor($query, $color)
{
    return $query->where('color', $color);
}

使用这个作用域:

$redLabels = Label::color('red')->get();

全局作用域示例

tests/Models/Scoped.php中,定义了一个全局作用域:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('active', function (Builder $builder) {
        $builder->where('active', true);
    });
}

这个全局作用域会自动应用到所有查询中,只返回activetrue的记录。

查询作用域的高级用法

动态作用域

你可以创建接受参数的动态作用域,使作用域更加灵活。例如,在tests/Models/Location.php中:

public function scopeWithinDistance($query, $latitude, $longitude, $distance)
{
    return $query->whereRaw([
        'location' => [
            '$near' => [
                '$geometry' => [
                    'type' => 'Point',
                    'coordinates' => [(float)$longitude, (float)$latitude]
                ],
                '$maxDistance' => $distance
            ]
        ]
    ]);
}

使用这个动态作用域:

$locations = Location::withinDistance(37.7749, -122.4194, 1000)->get();

组合作用域

你可以在一个作用域中调用另一个作用域,实现作用域的组合。例如:

public function scopePopularAndRecent($query)
{
    return $this->scopePopular($this->scopeRecent($query));
}

或者更简洁地:

public function scopePopularAndRecent($query)
{
    return $query->popular()->recent();
}

总结

查询作用域是laravel-mongodb中一个非常强大的功能,它允许你封装和重用查询逻辑,使代码更加简洁和可维护。通过本文的介绍,你应该已经了解了如何定义和使用全局作用域与局部作用域,以及它们在实际开发中的应用。

要深入了解laravel-mongodb的查询构建器,可以参考官方文档中的查询构建器部分。如果你想了解更多关于Eloquent模型的内容,可以查看Eloquent模型文档。

掌握查询作用域将帮助你更高效地构建复杂的查询,提高代码质量和开发效率。

【免费下载链接】laravel-mongodb A MongoDB based Eloquent model and Query builder for Laravel (Moloquent) 【免费下载链接】laravel-mongodb 项目地址: https://gitcode.com/gh_mirrors/la/laravel-mongodb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值