config = $config; // Build the connection string $dsn = $this->getDsn($config); // You can pass options directly to the MongoDB constructor $options = Arr::get($config, 'options', []); // Create the connection $this->connection = $this->createConnection($dsn, $config, $options); // Select database $this->db = $this->connection->selectDatabase($config['database']); $this->useDefaultPostProcessor(); $this->useDefaultSchemaGrammar(); $this->useDefaultQueryGrammar(); } /** * Begin a fluent query against a database collection. * * @param string $collection * @return Query\Builder */ public function collection($collection) { $query = new Query\Builder($this, $this->getPostProcessor()); return $query->from($collection); } /** * Begin a fluent query against a database collection. * * @param string $table * @return Query\Builder */ public function table($table) { return $this->collection($table); } /** * Get a MongoDB collection. * * @param string $name * @return Collection */ public function getCollection($name) { return new Collection($this, $this->db->selectCollection($name)); } /** * @inheritdoc */ public function getSchemaBuilder() { return new Schema\Builder($this); } /** * Get the MongoDB database object. * * @return \MongoDB\Database */ public function getMongoDB() { return $this->db; } /** * return MongoDB object. * * @return \MongoDB\Client */ public function getMongoClient() { return $this->connection; } /** * Create a new MongoDB connection. * * @param string $dsn * @param array $config * @param array $options * @return \MongoDB\Client */ protected function createConnection($dsn, array $config, array $options) { // By default driver options is an empty array. $driverOptions = []; if (isset($config['driver_options']) && is_array($config['driver_options'])) { $driverOptions = $config['driver_options']; } // Check if the credentials are not already set in the options if (!isset($options['username']) && !empty($config['username'])) { $options['username'] = $config['username']; } if (!isset($options['password']) && !empty($config['password'])) { $options['password'] = $config['password']; } return new Client($dsn, $options, $driverOptions); } /** * @inheritdoc */ public function disconnect() { unset($this->connection); } /** * Create a DSN string from a configuration. * * @param array $config * @return string */ protected function getDsn(array $config) { // Check if the user passed a complete dsn to the configuration. if (!empty($config['dsn'])) { return $config['dsn']; } // Treat host option as array of hosts $hosts = is_array($config['host']) ? $config['host'] : [$config['host']]; foreach ($hosts as &$host) { // Check if we need to add a port to the host if (strpos($host, ':') === false && !empty($config['port'])) { $host = $host . ':' . $config['port']; } } // Check if we want to authenticate against a specific database. $auth_database = isset($config['options']) && !empty($config['options']['database']) ? $config['options']['database'] : null; return 'mongodb://' . implode(',', $hosts) . ($auth_database ? '/' . $auth_database : ''); } /** * @inheritdoc */ public function getElapsedTime($start) { return parent::getElapsedTime($start); } /** * @inheritdoc */ public function getDriverName() { return 'mongodb'; } /** * @inheritdoc */ protected function getDefaultPostProcessor() { return new Query\Processor(); } /** * @inheritdoc */ protected function getDefaultQueryGrammar() { return new Query\Grammar(); } /** * @inheritdoc */ protected function getDefaultSchemaGrammar() { return new Schema\Grammar(); } /** * Dynamically pass methods to the connection. * * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { return call_user_func_array([$this->db, $method], $parameters); } }