laravel-mongodb, 面向 Laravel ( Moloquent )的基于MongoDB的Eloquent模型和查询生成器

分享于 

15分钟阅读

GitHub

  繁體
A Sybase Driver based Eloquent model and Query builder for Laravel 4
  • 源代码名称:laravel-mongodb
  • 源代码网址:http://www.github.com/jenssegers/laravel-mongodb
  • laravel-mongodb源代码文档
  • laravel-mongodb源代码下载
  • Git URL:
    git://www.github.com/jenssegers/laravel-mongodb.git
    Git Clone代码到本地:
    git clone http://www.github.com/jenssegers/laravel-mongodb
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/jenssegers/laravel-mongodb
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Laravel MongoDB

    Eloquent模型和查询构建器,支持MongoDB,使用原始的Laravel API,这个库扩展了原始的Laravel类,所以它使用了完全相同的方法。

    安装

    确保已安装MongoDB PHP驱动程序,这里可以找到安装说明

    警告:> = 3.0版本不再支持旧的mongo PHP驱动程序。

    使用composer安装:

    
    composer require jenssegers/mongodb
    
    
    
    

    Laravel版本兼容性

    Laravel软件包
    4.2 .x 2.0 .x
    5.0 .x 2.1 .x
    5.1 .x 2.2 .x或3.0 .x
    5.2 .x 2.3 .x或3.0 .x
    5.3 .x 3.1 .x或3.2 .x
    5.4 .x 3.2 .x
    5.5 .x 3.3 .x

    config/app.php中添加服务提供者:

    JenssegersMongodbMongodbServiceProvider::class,

    有关lumen的用法,请在bootstrap/app.php中添加服务提供者,在这个文件中,你还需要启用Eloquent,但是,你必须确保对$app->withEloquent();的调用位于已注册MongodbServiceProvider的下面:

    $app->register(JenssegersMongodbMongodbServiceProvider::class);$app->withEloquent();

    服务提供者将向原始数据库管理器注册一个mongodb数据库扩展,不需要注册额外的facade或对象,使用mongodb连接时,Laravel会自动为你提供相应的mongodb对象。

    有关Laravel之外的用法,请签出 Capsule manager并添加:

    $capsule->getDatabaseManager()->extend('mongodb', function($config){returnnewJenssegersMongodbConnection($config);});

    升级

    从版本2升级到3

    在这个支持mongodb PHP扩展的新主要发行版中,我们还移动了Model类的位置,并将MySQL Model类替换为一个特性。

    请将所有JenssegersMongodbModel引用更改为JenssegersMongodbEloquentModel在模型文件顶部,或你的注册别名。

    useJenssegersMongodbEloquentModelasEloquent;classUserextendsEloquent {}

    如果你使用混合关系,你的MySQL类现在应该扩展原始的Eloquent模型类IlluminateDatabaseEloquentModel而不是删除的JenssegersEloquentModel。而是使用新JenssegersMongodbEloquentHybridRelations trait,这应该让事情更加清晰,因为这个包中只有一个模型类,

    useJenssegersMongodbEloquentHybridRelations;classUserextendsEloquent {useHybridRelations;protected$connection='mysql';}

    嵌入的关系现在返回IlluminateDatabaseEloquentCollection 而不是自定义集合类,如果使用的是可用的特殊方法之一,请将这些方法转换为集合操作。

    $books=$user->books()->sortBy('title');

    测试

    要运行此包的测试,请运行:

    
    docker-compose up
    
    
    
    

    配置

    config/database.php中更改默认数据库连接名:

    'default'=> env('DB_CONNECTION', 'mongodb'),

    并添加新的mongodb连接:

    'mongodb'=> ['driver'=>'mongodb','host'=> env('DB_HOST', 'localhost'),'port'=> env('DB_PORT', 27017),'database'=> env('DB_DATABASE'),'username'=> env('DB_USERNAME'),'password'=> env('DB_PASSWORD'),'options'=> ['database'=>'admin'// sets the authentication database required by mongo 3 ]],

    可以使用以下配置连接到多个服务器或副本集:

    'mongodb'=> ['driver'=>'mongodb','host'=> ['server1', 'server2'],'port'=> env('DB_PORT', 27017),'database'=> env('DB_DATABASE'),'username'=> env('DB_USERNAME'),'password'=> env('DB_PASSWORD'),'options'=> ['replicaSet'=>'replicaSetName' ]],

    或者,你可以使用MongoDB连接字符串:

    'mongodb'=> ['driver'=>'mongodb','dsn'=> env('DB_DSN'),'database'=> env('DB_DATABASE'),],

    请参考MongoDB官方文档以获取它URI格式:https://docs.mongodb.com/manual/reference/connection-string/

    Eloquent

    这个包包含一个支持MongoDB的Eloquent类,你可以使用它为相应的集合定义模型。

    useJenssegersMongodbEloquentModelasEloquent;classUserextendsEloquent {}

    原始的Eloquent一样,小写,类的复数名称将用作集合名称,除非显式指定了另一个名称,可以通过在模型上定义collection属性来指定自定义集合(表的别名):

    useJenssegersMongodbEloquentModelasEloquent;classUserextendsEloquent {protected$collection='users_collection';}

    可以定义一个primaryKey属性来重写此约定,同样,可以定义一个connection属性来重写使用模型时应该使用的数据库连接的名称。

    useJenssegersMongodbEloquentModelasEloquent;classMyModelextendsEloquent {protected$connection='mongodb';}

    其他一切(应该)都像原始的Eloquent模型一样工作。

    可选:别名

    你还可以通过在config/app.php中的alias数组中添加以下内容为MongoDB模型注册别名:

    'Moloquent'=>JenssegersMongodbEloquentModel::class,

    这将允许你使用注册的别名,如:

    classMyModelextendsMoloquent {}

    查询生成器

    数据库驱动程序直接插入原始查询生成器,使用mongodb连接时,你可以构建流畅的查询来执行数据库操作,为了您的方便,有一个表的集合别名以及一些其他mongodb特定的运算符/操作。

    $users=DB::collection('users')->get();$user=DB::collection('users')->where('name', 'John')->first();

    如果未更改默认数据库连接,就在查询时需要指定它。

    $user=DB::connection('mongodb')->collection('users')->get();

    有关查询生成器的详细信息,请参阅http://laravel.com/docs/queries

    架构

    数据库驱动程序还支持(有限)架构生成器,你可以轻松操作集合并设置索引:

    Schema::create('users', function($collection){$collection->index('name');$collection->unique('email');});

    有关架构生成器的更多信息,请参见http://laravel.com/docs/schema

    地理空间索引

    地理空间索引可用于查询基于位置的文档,它们有两种形式:2d2dsphere,使用架构生成器将这些添加到集合中,

    添加2d索引:

    Schema::create('users', function($collection){$collection->geospatial('name', '2d');});

    添加2dsphere索引:

    Schema::create('users', function($collection){$collection->geospatial('name', '2dsphere');});

    扩展

    认证

    如果要使用Laravel Auth的本机功能,请注册包含的服务提供者:

    'JenssegersMongodbAuthPasswordResetServiceProvider',

    此服务提供者将稍微修改内部DatabaseReminderRepository以添加对基于MongoDB的密码提醒的支持,如果不使用密码提醒,你无需注册此服务提供商,否则一切工作正常。

    队列

    如果要使用MongoDB作为数据库后端,请更改config/queue.php中的驱动程序:

    'connections'=> ['database'=> ['driver'=>'mongodb','table'=>'jobs','queue'=>'default','expire'=>60, ],

    如果要使用MongoDB处理失败的作业,请在config/queue.php中更改数据库:

    'failed'=> ['database'=>'mongodb','table'=>'failed_jobs', ],

    config/app.php中添加服务提供者:

    JenssegersMongodbMongodbQueueServiceProvider::class,

    Sentry

    如果要将此库与sentry一起使用,请签出https://github.com/jenssegers/Laravel-MongoDB-Sentry

    会话

    MongoDB会话驱动程序在一个单独的包中可用,签出https://github.com/jenssegers/Laravel-MongoDB-Session

    例子

    基本用法

    检索所有模型

    $users=User::all();

    按主键检索记录

    $user=User::find('517c43667db388101e00000f');

    Wheres

    $users=User::where('votes', '>', 100)->take(10)->get();

    or语句

    $users=User::where('votes', '>', 100)->orWhere('name', 'John')->get();

    and 语句

    $users=User::where('votes', '>', 100)->where('name', '=', 'John')->get();

    在数组中使用where in

    $users=User::whereIn('age', [16, 18, 20])->get();

    当使用whereNotIn对象时,如果字段不存在,将返回,和whereNotNull('age')一起排除那些文件。

    使用where

    $users=User::whereBetween('votes', [1, 100])->get();

    where null

    $users=User::whereNull('updated_at')->get();

    ORDER BY

    $users=User::orderBy('name', 'desc')->get();

    Offset & Limit

    $users=User::skip(10)->take(5)->get();

    Distinct

    Distinct需要一个返回Distinct值的字段。

    $users=User::distinct()->get(['name']);// or$users=User::distinct('name')->get();

    Distinct可以与where组合:

    $users=User::where('active', true)->distinct('name')->get();

    高级where

    $users=User::where('name', '=', 'John')->orWhere(function($query) {$query->where('votes', '>', 100)->where('title', '<>', 'Admin'); })->get();

    GROUP BY

    未分组的选定列使用$last函数聚合。

    $users=Users::groupBy('title')->get(['title', 'name']);

    聚合

    聚合只对大于2.2的MongoDB版本可用。

    $total=Order::count();$price=Order::max('price');$price=Order::min('price');$price=Order::avg('price');$total=Order::sum('price');

    聚合可以与where组合:

    $sold=Orders::where('sold', true)->sum('price');

    聚合也可用于子文档:

    $total=Order::max('suborder.price');...

    注意:此聚集仅适用于单个子文档(如embedsOne),而不适用于子文档数组(如embedsMany)

    like

    $user=Comment::where('body', 'like', '%spam%')->get();

    增加或减少列的值

    对指定属性执行递增或递减(默认值1):

    User::where('name', 'John Doe')->increment('age');User::where('name', 'Jaques')->decrement('weight', 50);

    返回更新的对象数:

    $count=User->increment('age');

    你还可以指定要更新的附加列:

    User::where('age', '29')->increment('age', 1, ['group'=>'thirty something']);User::where('bmi', 30)->decrement('bmi', 1, ['category'=>'overweight']);

    软删除

    当软删除模型时,它实际上不会从数据库中删除,相反,在记录上设置了deleted_at时间戳,要为模型启用软删除,请将SoftDeletingTrait应用于模型:

    useJenssegersMongodbEloquentSoftDeletes;classUserextendsEloquent {useSoftDeletes;protected$dates= ['deleted_at'];}

    更多信息检查http://laravel.com/docs/eloquent#soft-deleting


    BASE  构建  模式  mongo  Laravel  Mongodb  
    相关文章