Commit 3e2837b7 authored by jose miguel's avatar jose miguel

Merge branch 'master' of github.com:jenssegers/laravel-mongodb into paginating

parents 82757887 cdc6e1d6
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
\ No newline at end of file
github: jenssegers
open_collective: laravel-mongodb
......@@ -7,3 +7,4 @@ composer.lock
*.sublime-workspace
*.project
.idea/
.phpunit.result.cache
sudo: required
dist: trusty
language: php
php:
- "7.2"
- "7.1"
language: minimal
matrix:
include:
- name: "7.1"
env: PHP_VERSION=7.1
- name: "7.2"
env: PHP_VERSION=7.2
- name: "7.3"
env: PHP_VERSION=7.3
services:
- docker
cache:
directories:
- $HOME/.composer/cache
install:
- docker version
- sudo pip install docker-compose
- docker-compose version
- cat Dockerfile
- docker-compose build --build-arg PHP_VERSION=${TRAVIS_PHP_VERSION}
- docker-compose build --build-arg PHP_VERSION=${PHP_VERSION}
- docker-compose run --rm tests composer install --no-interaction
script:
- docker-compose up --exit-code-from php
- docker-compose run --rm tests ./vendor/bin/phpunit --coverage-clover ./clover.xml
ARG PHP_VERSION=7.2
ARG COMPOSER_VERSION=1.8
FROM composer:${COMPOSER_VERSION}
FROM php:${PHP_VERSION}-cli
RUN pecl install xdebug
RUN apt-get update && \
apt-get install -y autoconf pkg-config libssl-dev git zlib1g-dev
RUN pecl install mongodb && docker-php-ext-enable mongodb && \
docker-php-ext-install -j$(nproc) pdo pdo_mysql zip && docker-php-ext-enable xdebug
apt-get install -y autoconf pkg-config libssl-dev git libzip-dev zlib1g-dev && \
pecl install mongodb && docker-php-ext-enable mongodb && \
pecl install xdebug && docker-php-ext-enable xdebug && \
docker-php-ext-install -j$(nproc) pdo_mysql zip
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/ \
&& ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
ENV PATH="~/.composer/vendor/bin:./vendor/bin:${PATH}"
WORKDIR /code
......@@ -43,6 +43,9 @@ composer require jenssegers/mongodb
5.4.x | 3.2.x
5.5.x | 3.3.x
5.6.x | 3.4.x
5.7.x | 3.4.x
5.8.x | 3.5.x
6.0.x | 3.6.x
And add the service provider in `config/app.php`:
......@@ -63,8 +66,10 @@ The service provider will register a mongodb database extension with the origina
For usage outside Laravel, check out the [Capsule manager](https://github.com/illuminate/database/blob/master/README.md) and add:
```php
$capsule->getDatabaseManager()->extend('mongodb', function($config)
$capsule->getDatabaseManager()->extend('mongodb', function($config, $name)
{
$config['name'] = $name;
return new Jenssegers\Mongodb\Connection($config);
});
```
......@@ -480,7 +485,7 @@ User::where('name', 'Jaques')->decrement('weight', 50);
The number of updated objects is returned:
```php
$count = User->increment('age');
$count = User::increment('age');
```
You may also specify additional columns to update:
......@@ -545,13 +550,13 @@ User::where('name', 'regex', new \MongoDB\BSON\Regex("/.*doe/i"))->get();
**NOTE:** you can also use the Laravel regexp operations. These are a bit more flexible and will automatically convert your regular expression string to a MongoDB\BSON\Regex object.
```php
User::where('name', 'regexp', '/.*doe/i'))->get();
User::where('name', 'regexp', '/.*doe/i')->get();
```
And the inverse:
```php
User::where('name', 'not regexp', '/.*doe/i'))->get();
User::where('name', 'not regexp', '/.*doe/i')->get();
```
**Type**
......
{
"name": "jenssegers/mongodb",
"description": "A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)",
"keywords": ["laravel","eloquent","mongodb","mongo","database","model","moloquent"],
"keywords": [
"laravel",
"eloquent",
"mongodb",
"mongo",
"database",
"model",
"moloquent"
],
"homepage": "https://github.com/jenssegers/laravel-mongodb",
"authors": [
{
......@@ -9,17 +17,17 @@
"homepage": "https://jenssegers.com"
}
],
"license" : "MIT",
"license": "MIT",
"require": {
"illuminate/support": "^5.6",
"illuminate/container": "^5.6",
"illuminate/database": "^5.6",
"illuminate/events": "^5.6",
"mongodb/mongodb": "^1.0.0"
"illuminate/support": "^5.8|^6.0",
"illuminate/container": "^5.8|^6.0",
"illuminate/database": "^5.8|^6.0",
"illuminate/events": "^5.8|^6.0",
"mongodb/mongodb": "^1.4"
},
"require-dev": {
"phpunit/phpunit": "^6.0|^7.0",
"orchestra/testbench": "^3.1",
"phpunit/phpunit": "^6.0|^7.0|^8.0",
"orchestra/testbench": "^3.1|^4.0",
"mockery/mockery": "^1.0",
"satooshi/php-coveralls": "^2.0",
"doctrine/dbal": "^2.5"
......
version: '3'
services:
php:
container_name: php
tests:
container_name: tests
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/code
working_dir: /code
command: bash -c "composer install --prefer-source --no-interaction && php ./vendor/bin/phpunit"
depends_on:
- mysql
- mongodb
- mysql
mysql:
container_name: mysql
image: mysql
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE: unittest
......@@ -27,5 +26,7 @@ services:
mongodb:
container_name: mongodb
image: mongo
ports:
- 27017:27017
logging:
driver: none
......@@ -7,42 +7,46 @@
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
verbose="true"
>
stopOnFailure="false">
<testsuites>
<testsuite name="all">
<directory>tests/</directory>
<exclude>tests/MysqlRelationsTest.php</exclude>
</testsuite>
<testsuite name="schema">
<directory>tests/SchemaTest.php</directory>
<file>tests/SchemaTest.php</file>
</testsuite>
<testsuite name="seeder">
<directory>tests/SeederTest.php</directory>
<file>tests/SeederTest.php</file>
</testsuite>
<testsuite name="cache">
<directory>tests/CacheTest.php</directory>
<file>tests/CacheTest.php</file>
</testsuite>
<testsuite name="builder">
<directory>tests/QueryBuilderTest.php</directory>
<directory>tests/QueryTest.php</directory>
<file>tests/QueryBuilderTest.php</file>
<file>tests/QueryTest.php</file>
</testsuite>
<testsuite name="model">
<directory>tests/ModelTest.php</directory>
<directory>tests/RelationsTest.php</directory>
<file>tests/ModelTest.php</file>
<file>tests/RelationsTest.php</file>
</testsuite>
<testsuite name="relations">
<directory>tests/RelationsTest.php</directory>
<directory>tests/EmbeddedRelationsTest.php</directory>
<file>tests/RelationsTest.php</file>
<file>tests/EmbeddedRelationsTest.php</file>
</testsuite>
<testsuite name="mysqlrelations">
<directory>tests/RelationsTest.php</directory>
<directory>tests/MysqlRelationsTest.php</directory>
<file>tests/RelationsTest.php</file>
</testsuite>
<testsuite name="validation">
<directory>tests/ValidationTest.php</directory>
<file>tests/ValidationTest.php</file>
</testsuite>
</testsuites>
<php>
<env name="MONGO_HOST" value="mongodb"/>
<env name="MONGO_DATABASE" value="unittest"/>
<env name="MONGO_PORT" value="27017"/>
<env name="MYSQL_HOST" value="mysql"/>
<env name="MYSQL_DATABASE" value="unittest"/>
<env name="MYSQL_USERNAME" value="root"/>
<env name="QUEUE_CONNECTION" value="database"/>
</php>
</phpunit>
......@@ -14,7 +14,11 @@ class DatabaseTokenRepository extends BaseDatabaseTokenRepository
*/
protected function getPayload($email, $token)
{
return ['email' => $email, 'token' => $this->hasher->make($token), 'created_at' => new UTCDateTime(time() * 1000)];
return [
'email' => $email,
'token' => $this->hasher->make($token),
'created_at' => new UTCDateTime(time() * 1000),
];
}
/**
......@@ -27,7 +31,7 @@ class DatabaseTokenRepository extends BaseDatabaseTokenRepository
$date = $createdAt->toDateTime();
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));
$createdAt = $date->format('Y-m-d H:i:s');
} elseif (is_array($createdAt) and isset($createdAt['date'])) {
} elseif (is_array($createdAt) && isset($createdAt['date'])) {
$date = new DateTime($createdAt['date'], new DateTimeZone(isset($createdAt['timezone']) ? $createdAt['timezone'] : 'UTC'));
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));
$createdAt = $date->format('Y-m-d H:i:s');
......
......@@ -11,14 +11,6 @@ class PasswordBrokerManager extends BasePasswordBrokerManager
*/
protected function createTokenRepository(array $config)
{
$key = $this->app['config']['app.key'];
if (\Illuminate\Support\Str::startsWith($key, 'base64:')) {
$key = base64_decode(substr($key, 7));
}
$connection = isset($config['connection']) ? $config['connection'] : null;
return new DatabaseTokenRepository(
$this->app['db']->connection(),
$this->app['hash'],
......
......@@ -8,7 +8,6 @@ class PasswordResetServiceProvider extends BasePasswordResetServiceProvider
{
/**
* Register the token repository implementation.
*
* @return void
*/
protected function registerTokenRepository()
......
......@@ -10,14 +10,12 @@ class Collection
{
/**
* The connection instance.
*
* @var Connection
*/
protected $connection;
/**
* The MongoCollection instance..
*
* @var MongoCollection
*/
protected $collection;
......@@ -34,7 +32,6 @@ class Collection
/**
* Handle dynamic method calls.
*
* @param string $method
* @param array $parameters
* @return mixed
......
......@@ -10,21 +10,18 @@ class Connection extends BaseConnection
{
/**
* The MongoDB database handler.
*
* @var \MongoDB\Database
*/
protected $db;
/**
* The MongoDB connection handler.
*
* @var \MongoDB\Client
*/
protected $connection;
/**
* Create a new database connection instance.
*
* @param array $config
*/
public function __construct(array $config)
......@@ -52,7 +49,6 @@ class Connection extends BaseConnection
/**
* Begin a fluent query against a database collection.
*
* @param string $collection
* @return Query\Builder
*/
......@@ -65,18 +61,17 @@ class Connection extends BaseConnection
/**
* Begin a fluent query against a database collection.
*
* @param string $table
* @param string|null $as
* @return Query\Builder
*/
public function table($table)
public function table($table, $as = null)
{
return $this->collection($table);
}
/**
* Get a MongoDB collection.
*
* @param string $name
* @return Collection
*/
......@@ -95,7 +90,6 @@ class Connection extends BaseConnection
/**
* Get the MongoDB database object.
*
* @return \MongoDB\Database
*/
public function getMongoDB()
......@@ -105,7 +99,6 @@ class Connection extends BaseConnection
/**
* return MongoDB object.
*
* @return \MongoDB\Client
*/
public function getMongoClient()
......@@ -113,9 +106,16 @@ class Connection extends BaseConnection
return $this->connection;
}
/**
* {@inheritdoc}
*/
public function getDatabaseName()
{
return $this->getMongoDB()->getDatabaseName();
}
/**
* Create a new MongoDB connection.
*
* @param string $dsn
* @param array $config
* @param array $options
......@@ -151,18 +151,16 @@ class Connection extends BaseConnection
/**
* Determine if the given configuration array has a dsn string.
*
* @param array $config
* @return bool
*/
protected function hasDsnString(array $config)
{
return isset($config['dsn']) && ! empty($config['dsn']);
return isset($config['dsn']) && !empty($config['dsn']);
}
/**
* Get the DSN string form configuration.
*
* @param array $config
* @return string
*/
......@@ -173,7 +171,6 @@ class Connection extends BaseConnection
/**
* Get the DSN string for a host / port configuration.
*
* @param array $config
* @return string
*/
......@@ -197,7 +194,6 @@ class Connection extends BaseConnection
/**
* Create a DSN string from a configuration.
*
* @param array $config
* @return string
*/
......@@ -250,7 +246,6 @@ class Connection extends BaseConnection
/**
* Dynamically pass methods to the connection.
*
* @param string $method
* @param array $parameters
* @return mixed
......
......@@ -13,7 +13,6 @@ class Builder extends EloquentBuilder
/**
* The methods that should be returned from query builder.
*
* @var array
*/
protected $passthru = [
......@@ -44,7 +43,7 @@ class Builder extends EloquentBuilder
return 1;
}
return $this->query->update($this->addUpdatedAtColumn($values), $options);
return $this->toBase()->update($this->addUpdatedAtColumn($values), $options);
}
/**
......@@ -177,6 +176,29 @@ class Builder extends EloquentBuilder
return $results;
}
/**
* Add the "updated at" column to an array of values.
* TODO Remove if https://github.com/laravel/framework/commit/6484744326531829341e1ff886cc9b628b20d73e
* wiil be reverted
* Issue in laravel frawework https://github.com/laravel/framework/issues/27791
* @param array $values
* @return array
*/
protected function addUpdatedAtColumn(array $values)
{
if (!$this->model->usesTimestamps() || $this->model->getUpdatedAtColumn() === null) {
return $values;
}
$column = $this->model->getUpdatedAtColumn();
$values = array_merge(
[$column => $this->model->freshTimestampString()],
$values
);
return $values;
}
/**
* @return \Illuminate\Database\ConnectionInterface
*/
......
......@@ -10,7 +10,6 @@ trait EmbedsRelations
{
/**
* Define an embedded one-to-many relationship.
*
* @param string $related
* @param string $localKey
* @param string $foreignKey
......@@ -22,17 +21,17 @@ trait EmbedsRelations
// If no relation name was given, we will use this debug backtrace to extract
// the calling method's name and use that as the relationship name as most
// of the time this will be what we desire to use for the relationships.
if (is_null($relation)) {
if ($relation === null) {
list(, $caller) = debug_backtrace(false);
$relation = $caller['function'];
}
if (is_null($localKey)) {
if ($localKey === null) {
$localKey = $relation;
}
if (is_null($foreignKey)) {
if ($foreignKey === null) {
$foreignKey = Str::snake(class_basename($this));
}
......@@ -45,7 +44,6 @@ trait EmbedsRelations
/**
* Define an embedded one-to-many relationship.
*
* @param string $related
* @param string $localKey
* @param string $foreignKey
......@@ -57,17 +55,17 @@ trait EmbedsRelations
// If no relation name was given, we will use this debug backtrace to extract
// the calling method's name and use that as the relationship name as most
// of the time this will be what we desire to use for the relationships.
if (is_null($relation)) {
if ($relation === null) {
list(, $caller) = debug_backtrace(false);
$relation = $caller['function'];
}
if (is_null($localKey)) {
if ($localKey === null) {
$localKey = $relation;
}
if (is_null($foreignKey)) {
if ($foreignKey === null) {
$foreignKey = Str::snake(class_basename($this));
}
......
......@@ -16,7 +16,6 @@ trait HybridRelations
{
/**
* Define a one-to-one relationship.
*
* @param string $related
* @param string $foreignKey
* @param string $localKey
......@@ -40,7 +39,6 @@ trait HybridRelations
/**
* Define a polymorphic one-to-one relationship.
*
* @param string $related
* @param string $name
* @param string $type
......@@ -66,7 +64,6 @@ trait HybridRelations
/**
* Define a one-to-many relationship.
*
* @param string $related
* @param string $foreignKey
* @param string $localKey
......@@ -90,7 +87,6 @@ trait HybridRelations
/**
* Define a polymorphic one-to-many relationship.
*
* @param string $related
* @param string $name
* @param string $type
......@@ -121,7 +117,6 @@ trait HybridRelations
/**
* Define an inverse one-to-one or many relationship.
*
* @param string $related
* @param string $foreignKey
* @param string $otherKey
......@@ -133,7 +128,7 @@ trait HybridRelations
// If no relation name was given, we will use this debug backtrace to extract
// the calling method's name and use that as the relationship name as most
// of the time this will be what we desire to use for the relationships.
if (is_null($relation)) {
if ($relation === null) {
list($current, $caller) = debug_backtrace(false, 2);
$relation = $caller['function'];
......@@ -147,7 +142,7 @@ trait HybridRelations
// If no foreign key was supplied, we can use a backtrace to guess the proper
// foreign key name by using the name of the relationship function, which
// when combined with an "_id" should conventionally match the columns.
if (is_null($foreignKey)) {
if ($foreignKey === null) {
$foreignKey = Str::snake($relation) . '_id';
}
......@@ -165,7 +160,6 @@ trait HybridRelations
/**
* Define a polymorphic, inverse one-to-one or many relationship.
*
* @param string $name
* @param string $type
* @param string $id
......@@ -177,7 +171,7 @@ trait HybridRelations
// If no name is provided, we will use the backtrace to get the function name
// since that is most likely the name of the polymorphic interface. We can
// use that to get both the class and foreign key that will be utilized.
if (is_null($name)) {
if ($name === null) {
list($current, $caller) = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
$name = Str::snake($caller['function']);
......@@ -188,7 +182,7 @@ trait HybridRelations
// If the type value is null it is probably safe to assume we're eager loading
// the relationship. When that is the case we will pass in a dummy query as
// there are multiple types in the morph and we can't use single queries.
if (is_null($class = $this->$type)) {
if (($class = $this->$type) === null) {
return new MorphTo(
$this->newQuery(), $this, $id, null, $type, $name
);
......@@ -197,7 +191,6 @@ trait HybridRelations
// If we are not eager loading the relationship we will essentially treat this
// as a belongs-to style relationship since morph-to extends that class and
// we will pass in the appropriate values so that it behaves as expected.
else {
$class = $this->getActualClassNameForMorph($class);
$instance = new $class;
......@@ -206,11 +199,9 @@ trait HybridRelations
$instance->newQuery(), $this, $id, $instance->getKeyName(), $type, $name
);
}
}
/**
* Define a many-to-many relationship.
*
* @param string $related
* @param string $collection
* @param string $foreignKey
......@@ -232,7 +223,7 @@ trait HybridRelations
// If no relationship name was passed, we will pull backtraces to get the
// name of the calling function. We will use that function name as the
// title of this relation since that is a great convention to apply.
if (is_null($relation)) {
if ($relation === null) {
$relation = $this->guessBelongsToManyRelation();
}
......@@ -261,7 +252,7 @@ trait HybridRelations
// If no table name was provided, we can guess it by concatenating the two
// models using underscores in alphabetical order. The two model names
// are transformed to snake case from their default CamelCase also.
if (is_null($collection)) {
if ($collection === null) {
$collection = $instance->getTable();
}
......@@ -284,7 +275,6 @@ trait HybridRelations
/**
* Get the relationship name of the belongs to many.
*
* @return string
*/
protected function guessBelongsToManyRelation()
......@@ -303,8 +293,8 @@ trait HybridRelations
{
if (is_subclass_of($this, \Jenssegers\Mongodb\Eloquent\Model::class)) {
return new Builder($query);
} else {
return new EloquentBuilder($query);
}
return new EloquentBuilder($query);
}
}
......@@ -4,15 +4,16 @@ namespace Jenssegers\Mongodb\Eloquent;
use Carbon\Carbon;
use DateTime;
use Illuminate\Contracts\Queue\QueueableCollection;
use Illuminate\Contracts\Queue\QueueableEntity;
use Illuminate\Database\Eloquent\Model as BaseModel;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Jenssegers\Mongodb\Query\Builder as QueryBuilder;
use MongoDB\BSON\Binary;
use MongoDB\BSON\ObjectID;
use MongoDB\BSON\UTCDateTime;
use Illuminate\Contracts\Queue\QueueableEntity;
use Illuminate\Contracts\Queue\QueueableCollection;
abstract class Model extends BaseModel
{
......@@ -20,35 +21,30 @@ abstract class Model extends BaseModel
/**
* The collection associated with the model.
*
* @var string
*/
protected $collection;
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = '_id';
/**
* The primary key type.
*
* @var string
*/
protected $keyType = 'string';
/**
* The parent relation instance.
*
* @var Relation
*/
protected $parentRelation;
/**
* Custom accessor for the model's id.
*
* @param mixed $value
* @return mixed
*/
......@@ -63,6 +59,8 @@ abstract class Model extends BaseModel
// Convert ObjectID to string.
if ($value instanceof ObjectID) {
return (string) $value;
} elseif ($value instanceof Binary) {
return (string) $value->getData();
}
return $value;
......@@ -204,6 +202,8 @@ abstract class Model extends BaseModel
foreach ($attributes as $key => &$value) {
if ($value instanceof ObjectID) {
$value = (string) $value;
} elseif ($value instanceof Binary) {
$value = (string) $value->getData();
}
}
......@@ -228,7 +228,7 @@ abstract class Model extends BaseModel
/**
* @inheritdoc
*/
protected function originalIsEquivalent($key, $current)
public function originalIsEquivalent($key, $current)
{
if (!array_key_exists($key, $this->original)) {
return false;
......@@ -262,7 +262,6 @@ abstract class Model extends BaseModel
/**
* Remove one or more fields.
*
* @param mixed $columns
* @return int
*/
......@@ -308,7 +307,6 @@ abstract class Model extends BaseModel
/**
* Remove one or more values from an array.
*
* @param string $column
* @param mixed $values
* @return mixed
......@@ -327,7 +325,6 @@ abstract class Model extends BaseModel
/**
* Append one or more values to the underlying attribute value and sync with original.
*
* @param string $column
* @param array $values
* @param bool $unique
......@@ -352,7 +349,6 @@ abstract class Model extends BaseModel
/**
* Remove one or more values to the underlying attribute value and sync with original.
*
* @param string $column
* @param array $values
*/
......@@ -385,7 +381,6 @@ abstract class Model extends BaseModel
/**
* Set the parent relation.
*
* @param \Illuminate\Database\Eloquent\Relations\Relation $relation
*/
public function setParentRelation(Relation $relation)
......@@ -395,7 +390,6 @@ abstract class Model extends BaseModel
/**
* Get the parent relation.
*
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function getParentRelation()
......@@ -431,7 +425,6 @@ abstract class Model extends BaseModel
/**
* Get the queueable relationships for the entity.
*
* @return array
*/
public function getQueueableRelations()
......@@ -445,13 +438,13 @@ abstract class Model extends BaseModel
if ($relation instanceof QueueableCollection) {
foreach ($relation->getQueueableRelations() as $collectionValue) {
$relations[] = $key.'.'.$collectionValue;
$relations[] = $key . '.' . $collectionValue;
}
}
if ($relation instanceof QueueableEntity) {
foreach ($relation->getQueueableRelations() as $entityKey => $entityValue) {
$relations[] = $key.'.'.$entityValue;
$relations[] = $key . '.' . $entityValue;
}
}
}
......@@ -461,7 +454,6 @@ abstract class Model extends BaseModel
/**
* Get loaded relations for the instance without parent.
*
* @return array
*/
protected function getRelationsWithoutParent()
......
......@@ -3,6 +3,8 @@
namespace Jenssegers\Mongodb\Helpers;
use Closure;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasOneOrMany;
......@@ -12,13 +14,12 @@ trait QueriesRelationships
{
/**
* Add a relationship count / exists condition to the query.
*
* @param string $relation
* @param string $operator
* @param int $count
* @param string $boolean
* @param \Closure|null $callback
* @return \Illuminate\Database\Eloquent\Builder|static
* @param Closure|null $callback
* @return Builder|static
*/
public function has($relation, $operator = '>=', $count = 1, $boolean = 'and', Closure $callback = null)
{
......@@ -74,7 +75,7 @@ trait QueriesRelationships
* @param string $boolean
* @param Closure|null $callback
* @return mixed
* @throws \Exception
* @throws Exception
*/
public function addHybridHas($relation, $operator = '>=', $count = 1, $boolean = 'and', Closure $callback = null)
{
......@@ -97,29 +98,6 @@ trait QueriesRelationships
return $this->whereIn($this->getRelatedConstraintKey($relation), $relatedIds, $boolean, $not);
}
/**
* Returns key we are constraining this parent model's query with
* @param $relation
* @return string
* @throws \Exception
*/
protected function getRelatedConstraintKey($relation)
{
if ($relation instanceof HasOneOrMany) {
return $this->model->getKeyName();
}
if ($relation instanceof BelongsTo) {
return $relation->getForeignKey();
}
if ($relation instanceof BelongsToMany && ! $this->isAcrossConnections($relation)) {
return $this->model->getKeyName();
}
throw new \Exception(class_basename($relation) . ' is not supported for hybrid query constraints.');
}
/**
* @param $relation
* @return string
......@@ -130,7 +108,7 @@ trait QueriesRelationships
return $relation->getHasCompareKey();
}
return $relation instanceof HasOneOrMany ? $relation->getForeignKeyName() : $relation->getOwnerKey();
return $relation instanceof HasOneOrMany ? $relation->getForeignKeyName() : $relation->getOwnerKeyName();
}
/**
......@@ -166,4 +144,27 @@ trait QueriesRelationships
// All related ids.
return array_keys($relationCount);
}
/**
* Returns key we are constraining this parent model's query with
* @param $relation
* @return string
* @throws Exception
*/
protected function getRelatedConstraintKey($relation)
{
if ($relation instanceof HasOneOrMany) {
return $this->model->getKeyName();
}
if ($relation instanceof BelongsTo) {
return $relation->getForeignKeyName();
}
if ($relation instanceof BelongsToMany && !$this->isAcrossConnections($relation)) {
return $this->model->getKeyName();
}
throw new Exception(class_basename($relation) . ' is not supported for hybrid query constraints.');
}
}
......@@ -2,6 +2,7 @@
namespace Jenssegers\Mongodb;
use DB;
use Illuminate\Queue\QueueServiceProvider;
use Jenssegers\Mongodb\Queue\Failed\MongoFailedJobProvider;
......@@ -13,7 +14,7 @@ class MongodbQueueServiceProvider extends QueueServiceProvider
protected function registerFailedJobServices()
{
// Add compatible queue failer if mongodb is configured.
if (config('queue.failed.database') == 'mongodb') {
if (DB::connection(config('queue.failed.database'))->getDriverName() == 'mongodb') {
$this->app->singleton('queue.failer', function ($app) {
return new MongoFailedJobProvider($app['db'], config('queue.failed.database'), config('queue.failed.table'));
});
......
......@@ -11,6 +11,7 @@ use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Jenssegers\Mongodb\Connection;
use MongoCollection;
use MongoDB\BSON\Binary;
use MongoDB\BSON\ObjectID;
use MongoDB\BSON\Regex;
use MongoDB\BSON\UTCDateTime;
......@@ -19,49 +20,42 @@ class Builder extends BaseBuilder
{
/**
* The database collection.
*
* @var MongoCollection
*/
protected $collection;
/**
* The column projections.
*
* @var array
*/
public $projections;
/**
* The cursor timeout value.
*
* @var int
*/
public $timeout;
/**
* The cursor hint value.
*
* @var int
*/
public $hint;
/**
* Custom options to add to the query.
*
* @var array
*/
public $options = [];
/**
* Indicate if we are executing a pagination query.
*
* @var bool
*/
public $paginating = false;
/**
* All of the available clause operators.
*
* @var array
*/
public $operators = [
......@@ -109,7 +103,6 @@ class Builder extends BaseBuilder
/**
* Operator conversion.
*
* @var array
*/
protected $conversion = [
......@@ -124,7 +117,6 @@ class Builder extends BaseBuilder
/**
* Check if we need to return Collections instead of plain arrays (laravel >= 5.3 )
*
* @var boolean
*/
protected $useCollections;
......@@ -142,7 +134,6 @@ class Builder extends BaseBuilder
/**
* Returns true if Laravel or Lumen >= 5.3
*
* @return bool
*/
protected function shouldUseCollections()
......@@ -158,7 +149,6 @@ class Builder extends BaseBuilder
/**
* Set the projections.
*
* @param array $columns
* @return $this
*/
......@@ -171,7 +161,6 @@ class Builder extends BaseBuilder
/**
* Set the cursor timeout in seconds.
*
* @param int $seconds
* @return $this
*/
......@@ -184,7 +173,6 @@ class Builder extends BaseBuilder
/**
* Set the cursor hint.
*
* @param mixed $index
* @return $this
*/
......@@ -203,6 +191,16 @@ class Builder extends BaseBuilder
return $this->where('_id', '=', $this->convertKey($id))->first($columns);
}
/**
* @inheritdoc
*/
public function value($column)
{
$result = (array) $this->first([$column]);
return Arr::get($result, $column);
}
/**
* @inheritdoc
*/
......@@ -213,7 +211,6 @@ class Builder extends BaseBuilder
/**
* Execute the query as a fresh "select" statement.
*
* @param array $columns
* @return array|static[]|Collection
*/
......@@ -222,7 +219,7 @@ class Builder extends BaseBuilder
// If no columns have been specified for the select statement, we will set them
// here to either the passed columns, or the standard default of retrieving
// all of the columns on the table using the "wildcard" column character.
if (is_null($this->columns)) {
if ($this->columns === null) {
$this->columns = $columns;
}
......@@ -412,7 +409,6 @@ class Builder extends BaseBuilder
/**
* Generate the unique cache key for the current query.
*
* @return string
*/
public function generateCacheKey()
......@@ -469,7 +465,7 @@ class Builder extends BaseBuilder
*/
public function exists()
{
return !is_null($this->first());
return $this->first() !== null;
}
/**
......@@ -506,7 +502,6 @@ class Builder extends BaseBuilder
/**
* Add a "where all" clause to the query.
*
* @param string $column
* @param array $values
* @param string $boolean
......@@ -580,7 +575,7 @@ class Builder extends BaseBuilder
$result = $this->collection->insertOne($values);
if (1 == (int) $result->isAcknowledged()) {
if (is_null($sequence)) {
if ($sequence === null) {
$sequence = '_id';
}
......@@ -644,12 +639,6 @@ class Builder extends BaseBuilder
*/
public function forPageAfterId($perPage = 15, $lastId = 0, $column = '_id')
{
// When using ObjectIDs to paginate, we need to use a hex string as the
// "minimum" ID rather than the integer zero so the '$lt' query works.
if ($column === '_id' && $lastId === 0) {
$lastId = '000000000000000000000000';
}
return parent::forPageAfterId($perPage, $lastId, $column);
}
......@@ -658,7 +647,7 @@ class Builder extends BaseBuilder
*/
public function pluck($column, $key = null)
{
$results = $this->get(is_null($key) ? [$column] : [$column, $key]);
$results = $this->get($key === null ? [$column] : [$column, $key]);
// Convert ObjectID's to strings
if ($key == '_id') {
......@@ -680,7 +669,7 @@ class Builder extends BaseBuilder
// If an ID is passed to the method, we will set the where clause to check
// the ID to allow developers to simply and quickly remove a single row
// from their database without manually specifying the where clauses.
if (!is_null($id)) {
if ($id !== null) {
$this->where('_id', '=', $id);
}
......@@ -696,7 +685,7 @@ class Builder extends BaseBuilder
/**
* @inheritdoc
*/
public function from($collection)
public function from($collection, $as = null)
{
if ($collection) {
$this->collection = $this->connection->getCollection($collection);
......@@ -717,11 +706,10 @@ class Builder extends BaseBuilder
/**
* Get an array with the values of a given column.
*
* @deprecated
* @param string $column
* @param string $key
* @return array
* @deprecated
*/
public function lists($column, $key = null)
{
......@@ -736,8 +724,10 @@ class Builder extends BaseBuilder
// Execute the closure on the mongodb collection
if ($expression instanceof Closure) {
return call_user_func($expression, $this->collection);
} // Create an expression for the given value
elseif (!is_null($expression)) {
}
// Create an expression for the given value
if ($expression !== null) {
return new Expression($expression);
}
......@@ -747,7 +737,6 @@ class Builder extends BaseBuilder
/**
* Append one or more values to an array.
*
* @param mixed $column
* @param mixed $value
* @param bool $unique
......@@ -774,7 +763,6 @@ class Builder extends BaseBuilder
/**
* Remove one or more values from an array.
*
* @param mixed $column
* @param mixed $value
* @return int
......@@ -798,7 +786,6 @@ class Builder extends BaseBuilder
/**
* Remove one or more fields.
*
* @param mixed $columns
* @return int
*/
......@@ -829,7 +816,6 @@ class Builder extends BaseBuilder
/**
* Perform an update query.
*
* @param array $query
* @param array $options
* @return int
......@@ -852,7 +838,6 @@ class Builder extends BaseBuilder
/**
* Convert a key to ObjectID if needed.
*
* @param mixed $id
* @return mixed
*/
......@@ -862,6 +847,10 @@ class Builder extends BaseBuilder
return new ObjectID($id);
}
if (is_string($id) && strlen($id) === 16 && preg_match('~[^\x20-\x7E\t\r\n]~', $id) > 0) {
return new Binary($id, Binary::TYPE_UUID);
}
return $id;
}
......@@ -886,7 +875,6 @@ class Builder extends BaseBuilder
/**
* Compile the where array.
*
* @return array
*/
protected function compileWheres()
......@@ -1001,9 +989,13 @@ class Builder extends BaseBuilder
{
extract($where);
// Replace like with a Regex instance.
if ($operator == 'like') {
// Replace like or not like with a Regex instance.
if (in_array($operator, ['like', 'not like'])) {
if ($operator === 'not like') {
$operator = 'not';
} else {
$operator = '=';
}
// Convert to regular expression.
$regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value));
......@@ -1013,7 +1005,7 @@ class Builder extends BaseBuilder
$regex = '^' . $regex;
}
if (!Str::endsWith($value, '%')) {
$regex = $regex . '$';
$regex .= '$';
}
$value = new Regex($regex, 'i');
......@@ -1125,7 +1117,8 @@ class Builder extends BaseBuilder
],
],
];
} else {
}
return [
$column => [
'$gte' => $values[0],
......@@ -1133,7 +1126,6 @@ class Builder extends BaseBuilder
],
];
}
}
/**
* @param array $where
......@@ -1146,7 +1138,6 @@ class Builder extends BaseBuilder
/**
* Set custom options for the query.
*
* @param array $options
* @return $this
*/
......
......@@ -9,11 +9,9 @@ class MongoFailedJobProvider extends DatabaseFailedJobProvider
{
/**
* Log a failed job into storage.
*
* @param string $connection
* @param string $queue
* @param string $payload
*
* @return void
*/
public function log($connection, $queue, $payload, $exception)
......@@ -25,7 +23,6 @@ class MongoFailedJobProvider extends DatabaseFailedJobProvider
/**
* Get a list of all of the failed jobs.
*
* @return object[]
*/
public function all()
......@@ -42,7 +39,6 @@ class MongoFailedJobProvider extends DatabaseFailedJobProvider
/**
* Get a single failed job.
*
* @param mixed $id
* @return object
*/
......@@ -50,6 +46,10 @@ class MongoFailedJobProvider extends DatabaseFailedJobProvider
{
$job = $this->getTable()->find($id);
if (!$job) {
return;
}
$job['id'] = (string) $job['_id'];
return (object) $job;
......@@ -57,7 +57,6 @@ class MongoFailedJobProvider extends DatabaseFailedJobProvider
/**
* Delete a single failed job from storage.
*
* @param mixed $id
* @return bool
*/
......
......@@ -10,14 +10,12 @@ class MongoConnector implements ConnectorInterface
{
/**
* Database connections.
*
* @var \Illuminate\Database\ConnectionResolverInterface
*/
protected $connections;
/**
* Create a new connector instance.
*
* @param \Illuminate\Database\ConnectionResolverInterface $connections
*/
public function __construct(ConnectionResolverInterface $connections)
......@@ -27,7 +25,6 @@ class MongoConnector implements ConnectorInterface
/**
* Establish a queue connection.
*
* @param array $config
* @return \Illuminate\Contracts\Queue\Queue
*/
......
......@@ -8,7 +8,6 @@ class MongoJob extends DatabaseJob
{
/**
* Indicates if the job has been reserved.
*
* @return bool
*/
public function isReserved()
......
......@@ -11,14 +11,12 @@ class MongoQueue extends DatabaseQueue
{
/**
* The expiration time of a job.
*
* @var int|null
*/
protected $retryAfter = 60;
/**
* The connection name for the queue.
*
* @var string
*/
protected $connectionName;
......@@ -39,7 +37,7 @@ class MongoQueue extends DatabaseQueue
{
$queue = $this->getQueue($queue);
if (!is_null($this->retryAfter)) {
if ($this->retryAfter !== null) {
$this->releaseJobsThatHaveBeenReservedTooLong($queue);
}
......@@ -52,17 +50,13 @@ class MongoQueue extends DatabaseQueue
/**
* Get the next available job for the queue and mark it as reserved.
*
* When using multiple daemon queue listeners to process jobs there
* is a possibility that multiple processes can end up reading the
* same record before one has flagged it as reserved.
*
* This race condition can result in random jobs being run more then
* once. To solve this we use findOneAndUpdate to lock the next jobs
* record while flagging it as reserved at the same time.
*
* @param string|null $queue
*
* @return \StdClass|null
*/
protected function getNextAvailableJobAndReserve($queue)
......@@ -70,7 +64,7 @@ class MongoQueue extends DatabaseQueue
$job = $this->database->getCollection($this->table)->findOneAndUpdate(
[
'queue' => $this->getQueue($queue),
'reserved' => 0,
'reserved' => ['$ne' => 1],
'available_at' => ['$lte' => Carbon::now()->getTimestamp()],
],
[
......@@ -78,6 +72,9 @@ class MongoQueue extends DatabaseQueue
'reserved' => 1,
'reserved_at' => Carbon::now()->getTimestamp(),
],
'$inc' => [
'attempts' => 1,
],
],
[
'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER,
......@@ -94,37 +91,26 @@ class MongoQueue extends DatabaseQueue
/**
* Release the jobs that have been reserved for too long.
*
* @param string $queue
* @return void
*/
protected function releaseJobsThatHaveBeenReservedTooLong($queue)
{
$expiration = Carbon::now()->subSeconds($this->retryAfter)->getTimestamp();
$now = time();
$reserved = $this->database->collection($this->table)
->where('queue', $this->getQueue($queue))
->where(function ($query) use ($expiration, $now) {
// Check for available jobs
$query->where(function ($query) use ($now) {
$query->whereNull('reserved_at');
$query->where('available_at', '<=', $now);
});
// Check for jobs that are reserved but have expired
$query->orWhere('reserved_at', '<=', $expiration);
})->get();
->whereNotNull('reserved_at')
->where('reserved_at', '<=', $expiration)
->get();
foreach ($reserved as $job) {
$attempts = $job['attempts'] + 1;
$this->releaseJob($job['_id'], $attempts);
$this->releaseJob($job['_id'], $job['attempts']);
}
}
/**
* Release the given job ID from reservation.
*
* @param string $id
* @param int $attempts
* @return void
......
......@@ -9,7 +9,6 @@ class BelongsTo extends \Illuminate\Database\Eloquent\Relations\BelongsTo
{
/**
* Get the key for comparing against the parent key in "has" query.
*
* @return string
*/
public function getHasCompareKey()
......@@ -53,7 +52,6 @@ class BelongsTo extends \Illuminate\Database\Eloquent\Relations\BelongsTo
/**
* Get the owner key with backwards compatible support.
*
* @return string
*/
public function getOwnerKey()
......@@ -63,7 +61,6 @@ class BelongsTo extends \Illuminate\Database\Eloquent\Relations\BelongsTo
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -5,15 +5,14 @@ namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Relations\BelongsToMany as EloquentBelongsToMany;
use Illuminate\Support\Arr;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class BelongsToMany extends EloquentBelongsToMany
{
/**
* Get the key for comparing against the parent key in "has" query.
*
* @return string
*/
public function getHasCompareKey()
......@@ -39,7 +38,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Set the select clause for the relation query.
*
* @param array $columns
* @return array
*/
......@@ -68,7 +66,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Set the where clause for the relation query.
*
* @return $this
*/
protected function setWhere()
......@@ -275,7 +272,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Create a new query builder for the related model.
*
* @return \Illuminate\Database\Query\Builder
*/
public function newRelatedQuery()
......@@ -285,7 +281,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Get the fully qualified foreign key for the relation.
*
* @return string
*/
public function getForeignKey()
......@@ -312,10 +307,9 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Format the sync list so that it is keyed by ID. (Legacy Support)
* The original function has been renamed to formatRecordsList since Laravel 5.3
*
* @deprecated
* @param array $records
* @return array
* @deprecated
*/
protected function formatSyncList(array $records)
{
......@@ -331,7 +325,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Get the related key with backwards compatible support.
*
* @return string
*/
public function getRelatedKey()
......@@ -341,7 +334,6 @@ class BelongsToMany extends EloquentBelongsToMany
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -4,10 +4,10 @@ namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use MongoDB\BSON\ObjectID;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class EmbedsMany extends EmbedsOneOrMany
{
......@@ -33,7 +33,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Save a new model and attach it to the parent model.
*
* @param Model $model
* @return Model|bool
*/
......@@ -63,7 +62,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Save an existing model and attach it to the parent model.
*
* @param Model $model
* @return Model|bool
*/
......@@ -95,7 +93,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Delete an existing model and detach it from the parent model.
*
* @param Model $model
* @return int
*/
......@@ -122,7 +119,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Associate the model instance to the given parent, without saving it to the database.
*
* @param Model $model
* @return Model
*/
......@@ -130,14 +126,13 @@ class EmbedsMany extends EmbedsOneOrMany
{
if (!$this->contains($model)) {
return $this->associateNew($model);
} else {
return $this->associateExisting($model);
}
return $this->associateExisting($model);
}
/**
* Dissociate the model instance from the given parent, without saving it to the database.
*
* @param mixed $ids
* @return int
*/
......@@ -166,7 +161,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Destroy the embedded models for the given IDs.
*
* @param mixed $ids
* @return int
*/
......@@ -191,7 +185,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Delete all embedded models.
*
* @return int
*/
public function delete()
......@@ -208,7 +201,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Destroy alias.
*
* @param mixed $ids
* @return int
*/
......@@ -219,7 +211,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Save alias.
*
* @param Model $model
* @return Model
*/
......@@ -230,14 +221,13 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Associate a new model instance to the given parent, without saving it to the database.
*
* @param Model $model
* @return Model
*/
protected function associateNew($model)
{
// Create a new key if needed.
if (!$model->getAttribute('_id')) {
if ($model->getKeyName() === '_id' && !$model->getAttribute('_id')) {
$model->setAttribute('_id', new ObjectID);
}
......@@ -251,7 +241,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Associate an existing model instance to the given parent, without saving it to the database.
*
* @param Model $model
* @return Model
*/
......@@ -277,7 +266,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Get a paginator for the "select" statement.
*
* @param int $perPage
* @return \Illuminate\Pagination\AbstractPaginator
*/
......@@ -332,7 +320,6 @@ class EmbedsMany extends EmbedsOneOrMany
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -3,8 +3,8 @@
namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Model;
use MongoDB\BSON\ObjectID;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use MongoDB\BSON\ObjectID;
class EmbedsOne extends EmbedsOneOrMany
{
......@@ -30,7 +30,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Save a new model and attach it to the parent model.
*
* @param Model $model
* @return Model|bool
*/
......@@ -59,7 +58,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Save an existing model and attach it to the parent model.
*
* @param Model $model
* @return Model|bool
*/
......@@ -85,7 +83,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Delete an existing model and detach it from the parent model.
*
* @return int
*/
public function performDelete()
......@@ -109,7 +106,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Attach the model to its parent.
*
* @param Model $model
* @return Model
*/
......@@ -120,7 +116,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Detach the model from its parent.
*
* @return Model
*/
public function dissociate()
......@@ -130,7 +125,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Delete all embedded models.
*
* @return int
*/
public function delete()
......@@ -140,7 +134,6 @@ class EmbedsOne extends EmbedsOneOrMany
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -4,36 +4,32 @@ namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Relations\Relation;
use Jenssegers\Mongodb\Eloquent\Model;
use Illuminate\Database\Eloquent\Model as EloquentModel;
abstract class EmbedsOneOrMany extends Relation
{
/**
* The local key of the parent model.
*
* @var string
*/
protected $localKey;
/**
* The foreign key of the parent model.
*
* @var string
*/
protected $foreignKey;
/**
* The "name" of the relationship.
*
* @var string
*/
protected $relation;
/**
* Create a new embeds many relationship instance.
*
* @param Builder $query
* @param Model $parent
* @param Model $related
......@@ -94,9 +90,7 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Shorthand to get the results of the relationship.
*
* @param array $columns
*
* @return Collection
*/
public function get($columns = ['*'])
......@@ -106,7 +100,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the number of embedded models.
*
* @return int
*/
public function count()
......@@ -116,7 +109,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Attach a model instance to the parent model.
*
* @param Model $model
* @return Model|bool
*/
......@@ -129,7 +121,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Attach a collection of models to the parent instance.
*
* @param Collection|array $models
* @return Collection|array
*/
......@@ -144,7 +135,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Create a new instance of the related model.
*
* @param array $attributes
* @return Model
*/
......@@ -164,7 +154,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Create an array of new instances of the related model.
*
* @param array $records
* @return array
*/
......@@ -181,7 +170,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Transform single ID, single Model or array of Models into an array of IDs.
*
* @param mixed $ids
* @return array
*/
......@@ -236,7 +224,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the foreign key value for the relation.
*
* @param mixed $id
* @return mixed
*/
......@@ -252,7 +239,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Convert an array of records to a Collection.
*
* @param array $records
* @return Collection
*/
......@@ -273,13 +259,12 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Create a related model instanced.
*
* @param array $attributes
* @return Model
*/
protected function toModel($attributes = [])
{
if (is_null($attributes)) {
if ($attributes === null) {
return;
}
......@@ -302,7 +287,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the relation instance of the parent.
*
* @return Relation
*/
protected function getParentRelation()
......@@ -332,7 +316,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Check if this relation is nested in another relation.
*
* @return bool
*/
protected function isNested()
......@@ -342,7 +325,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the fully qualified local key name.
*
* @param string $glue
* @return string
*/
......@@ -369,7 +351,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the primary key value of the parent.
*
* @return string
*/
protected function getParentKey()
......@@ -379,7 +360,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Return update values
*
* @param $array
* @param string $prepend
* @return array
......@@ -389,7 +369,7 @@ abstract class EmbedsOneOrMany extends Relation
$results = [];
foreach ($array as $key => $value) {
$results[$prepend.$key] = $value;
$results[$prepend . $key] = $value;
}
return $results;
......@@ -397,7 +377,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the foreign key for the relationship.
*
* @return string
*/
public function getQualifiedForeignKeyName()
......@@ -407,7 +386,6 @@ abstract class EmbedsOneOrMany extends Relation
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -3,14 +3,13 @@
namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\HasMany as EloquentHasMany;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Relations\HasMany as EloquentHasMany;
class HasMany extends EloquentHasMany
{
/**
* Get the plain foreign key.
*
* @return string
*/
public function getForeignKeyName()
......@@ -20,7 +19,6 @@ class HasMany extends EloquentHasMany
/**
* Get the plain foreign key.
*
* @return string
*/
public function getPlainForeignKey()
......@@ -30,7 +28,6 @@ class HasMany extends EloquentHasMany
/**
* Get the key for comparing against the parent key in "has" query.
*
* @return string
*/
public function getHasCompareKey()
......@@ -50,7 +47,6 @@ class HasMany extends EloquentHasMany
/**
* Add the constraints for a relationship count query.
*
* @param Builder $query
* @param Builder $parent
* @return Builder
......@@ -64,7 +60,6 @@ class HasMany extends EloquentHasMany
/**
* Add the constraints for a relationship query.
*
* @param Builder $query
* @param Builder $parent
* @param array|mixed $columns
......@@ -81,7 +76,6 @@ class HasMany extends EloquentHasMany
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -3,14 +3,13 @@
namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\HasOne as EloquentHasOne;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Relations\HasOne as EloquentHasOne;
class HasOne extends EloquentHasOne
{
/**
* Get the key for comparing against the parent key in "has" query.
*
* @return string
*/
public function getForeignKeyName()
......@@ -20,7 +19,6 @@ class HasOne extends EloquentHasOne
/**
* Get the key for comparing against the parent key in "has" query.
*
* @return string
*/
public function getHasCompareKey()
......@@ -30,7 +28,6 @@ class HasOne extends EloquentHasOne
/**
* Get the plain foreign key.
*
* @return string
*/
public function getPlainForeignKey()
......@@ -50,7 +47,6 @@ class HasOne extends EloquentHasOne
/**
* Add the constraints for a relationship count query.
*
* @param Builder $query
* @param Builder $parent
* @return Builder
......@@ -64,7 +60,6 @@ class HasOne extends EloquentHasOne
/**
* Add the constraints for a relationship query.
*
* @param Builder $query
* @param Builder $parent
* @param array|mixed $columns
......@@ -81,7 +76,6 @@ class HasOne extends EloquentHasOne
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -2,8 +2,8 @@
namespace Jenssegers\Mongodb\Relations;
use Illuminate\Database\Eloquent\Relations\MorphTo as EloquentMorphTo;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Relations\MorphTo as EloquentMorphTo;
class MorphTo extends EloquentMorphTo
{
......@@ -36,7 +36,6 @@ class MorphTo extends EloquentMorphTo
/**
* Get the owner key with backwards compatible support.
*
* @return string
*/
public function getOwnerKey()
......@@ -46,7 +45,6 @@ class MorphTo extends EloquentMorphTo
/**
* Get the name of the "where in" method for eager loading.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @return string
......
......@@ -8,21 +8,18 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
{
/**
* The MongoConnection object for this blueprint.
*
* @var \Jenssegers\Mongodb\Connection
*/
protected $connection;
/**
* The MongoCollection object for this blueprint.
*
* @var \Jenssegers\Mongodb\Collection|\MongoDB\Collection
*/
protected $collection;
/**
* Fluent columns.
*
* @var array
*/
protected $columns = [];
......@@ -77,6 +74,54 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
* @inheritdoc
*/
public function dropIndex($indexOrColumns = null)
{
$indexOrColumns = $this->transformColumns($indexOrColumns);
$this->collection->dropIndex($indexOrColumns);
return $this;
}
/**
* Indicate that the given index should be dropped, but do not fail if it didn't exist.
*
* @param string|array $indexOrColumns
* @return Blueprint
*/
public function dropIndexIfExists($indexOrColumns = null)
{
if ($this->hasIndex($indexOrColumns)) {
$this->dropIndex($indexOrColumns);
}
return $this;
}
/**
* Check whether the given index exists.
*
* @param string|array $indexOrColumns
* @return bool
*/
public function hasIndex($indexOrColumns = null)
{
$indexOrColumns = $this->transformColumns($indexOrColumns);
foreach ($this->collection->listIndexes() as $index) {
if (is_array($indexOrColumns) && in_array($index->getName(), $indexOrColumns)) {
return true;
}
if (is_string($indexOrColumns) && $index->getName() == $indexOrColumns) {
return true;
}
}
return false;
}
/**
* @param string|array $indexOrColumns
* @return string
*/
protected function transformColumns($indexOrColumns)
{
if (is_array($indexOrColumns)) {
$indexOrColumns = $this->fluent($indexOrColumns);
......@@ -88,12 +133,9 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
$transform[$column] = $column . '_1';
}
$indexOrColumns = join('_', $transform);
$indexOrColumns = implode('_', $transform);
}
$this->collection->dropIndex($indexOrColumns);
return $this;
return $indexOrColumns;
}
/**
......@@ -112,7 +154,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Specify a non blocking index for the collection.
*
* @param string|array $columns
* @return Blueprint
*/
......@@ -127,7 +168,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Specify a sparse index for the collection.
*
* @param string|array $columns
* @param array $options
* @return Blueprint
......@@ -145,7 +185,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Specify a geospatial index for the collection.
*
* @param string|array $columns
* @param string $index
* @param array $options
......@@ -171,7 +210,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Specify the number of seconds after wich a document should be considered expired based,
* on the given single-field index containing a date.
*
* @param string|array $columns
* @param int $seconds
* @return Blueprint
......@@ -218,7 +256,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Specify a sparse and unique index for the collection.
*
* @param string|array $columns
* @param array $options
* @return Blueprint
......@@ -237,13 +274,12 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Allow fluent columns.
*
* @param string|array $columns
* @return string|array
*/
protected function fluent($columns = null)
{
if (is_null($columns)) {
if ($columns === null) {
return $this->columns;
} elseif (is_string($columns)) {
return $this->columns = [$columns];
......@@ -254,7 +290,6 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint
/**
* Allows the use of unsupported schema methods.
*
* @param $method
* @param $args
* @return Blueprint
......
......@@ -33,7 +33,6 @@ class Builder extends \Illuminate\Database\Schema\Builder
/**
* Determine if the given collection exists.
*
* @param string $collection
* @return bool
*/
......@@ -60,7 +59,6 @@ class Builder extends \Illuminate\Database\Schema\Builder
/**
* Modify a collection on the schema.
*
* @param string $collection
* @param Closure $callback
* @return bool
......@@ -85,11 +83,11 @@ class Builder extends \Illuminate\Database\Schema\Builder
/**
* @inheritdoc
*/
public function create($collection, Closure $callback = null)
public function create($collection, Closure $callback = null, array $options = [])
{
$blueprint = $this->createBlueprint($collection);
$blueprint->create();
$blueprint->create($options);
if ($callback) {
$callback($blueprint);
......@@ -138,7 +136,6 @@ class Builder extends \Illuminate\Database\Schema\Builder
/**
* Get all of the collections names for the database.
*
* @return array
*/
protected function getAllCollections()
......
......@@ -6,7 +6,6 @@ class DatabasePresenceVerifier extends \Illuminate\Validation\DatabasePresenceVe
{
/**
* Count the number of objects in a collection having the given value.
*
* @param string $collection
* @param string $column
* @param string $value
......@@ -19,7 +18,7 @@ class DatabasePresenceVerifier extends \Illuminate\Validation\DatabasePresenceVe
{
$query = $this->table($collection)->where($column, 'regex', "/$value/i");
if (!is_null($excludeId) && $excludeId != 'NULL') {
if ($excludeId !== null && $excludeId != 'NULL') {
$query->where($idColumn ?: 'id', '<>', $excludeId);
}
......@@ -32,7 +31,6 @@ class DatabasePresenceVerifier extends \Illuminate\Validation\DatabasePresenceVe
/**
* Count the number of objects in a collection with the given values.
*
* @param string $collection
* @param string $column
* @param array $values
......
......@@ -2,11 +2,13 @@
use Illuminate\Auth\Passwords\PasswordBroker;
use Illuminate\Foundation\Application;
use MongoDB\BSON\UTCDateTime;
class AuthTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
parent::setUp();
User::truncate();
DB::collection('password_reminders')->truncate();
}
......@@ -26,6 +28,7 @@ class AuthTest extends TestCase
public function testRemindOld()
{
if (Application::VERSION >= '5.2') {
$this->expectNotToPerformAssertions();
return;
}
......@@ -48,7 +51,7 @@ class AuthTest extends TestCase
$reminder = DB::collection('password_resets')->first();
$this->assertEquals('john@doe.com', $reminder['email']);
$this->assertNotNull($reminder['token']);
$this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $reminder['created_at']);
$this->assertInstanceOf(UTCDateTime::class, $reminder['created_at']);
$credentials = [
'email' => 'john@doe.com',
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Connection;
use Jenssegers\Mongodb\Collection;
use MongoDB\Collection as MongoCollection;
use Jenssegers\Mongodb\Connection;
use MongoDB\BSON\ObjectID;
use MongoDB\Collection as MongoCollection;
class CollectionTest extends TestCase
{
......
<?php
declare(strict_types=1);
use Illuminate\Support\Facades\DB;
class ConnectionTest extends TestCase
{
public function testConnection()
{
$connection = DB::connection('mongodb');
$this->assertInstanceOf('Jenssegers\Mongodb\Connection', $connection);
$this->assertInstanceOf(\Jenssegers\Mongodb\Connection::class, $connection);
}
public function testReconnect()
......@@ -23,28 +26,28 @@ class ConnectionTest extends TestCase
public function testDb()
{
$connection = DB::connection('mongodb');
$this->assertInstanceOf('MongoDB\Database', $connection->getMongoDB());
$this->assertInstanceOf(\MongoDB\Database::class, $connection->getMongoDB());
$connection = DB::connection('mongodb');
$this->assertInstanceOf('MongoDB\Client', $connection->getMongoClient());
$this->assertInstanceOf(\MongoDB\Client::class, $connection->getMongoClient());
}
public function testCollection()
{
$collection = DB::connection('mongodb')->getCollection('unittest');
$this->assertInstanceOf('Jenssegers\Mongodb\Collection', $collection);
$this->assertInstanceOf(Jenssegers\Mongodb\Collection::class, $collection);
$collection = DB::connection('mongodb')->collection('unittests');
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', $collection);
$this->assertInstanceOf(Jenssegers\Mongodb\Query\Builder::class, $collection);
$collection = DB::connection('mongodb')->table('unittests');
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', $collection);
$this->assertInstanceOf(Jenssegers\Mongodb\Query\Builder::class, $collection);
}
// public function testDynamic()
// {
// $dbs = DB::connection('mongodb')->listCollections();
// $this->assertInternalType('array', $dbs);
// $this->assertIsArray($dbs);
// }
// public function testMultipleConnections()
......@@ -87,7 +90,7 @@ class ConnectionTest extends TestCase
public function testSchemaBuilder()
{
$schema = DB::connection('mongodb')->getSchemaBuilder();
$this->assertInstanceOf('Jenssegers\Mongodb\Schema\Builder', $schema);
$this->assertInstanceOf(\Jenssegers\Mongodb\Schema\Builder::class, $schema);
}
public function testDriverName()
......
<?php
declare(strict_types=1);
class DsnTest extends TestCase
{
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Events\Dispatcher;
use MongoDB\BSON\ObjectId;
class EmbeddedRelationsTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
Mockery::close();
......@@ -20,38 +25,50 @@ class EmbeddedRelationsTest extends TestCase
$user = User::create(['name' => 'John Doe']);
$address = new Address(['city' => 'London']);
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($address), $address);
$events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.creating: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('dispatch')->once()->with('eloquent.created: ' . get_class($address), $address);
$events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($address), $address);
$address = $user->addresses()->save($address);
$address->unsetEventDispatcher();
$this->assertNotNull($user->addresses);
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user->addresses);
$this->assertInstanceOf(\Illuminate\Database\Eloquent\Collection::class, $user->addresses);
$this->assertEquals(['London'], $user->addresses->pluck('city')->all());
$this->assertInstanceOf('DateTime', $address->created_at);
$this->assertInstanceOf('DateTime', $address->updated_at);
$this->assertInstanceOf(DateTime::class, $address->created_at);
$this->assertInstanceOf(DateTime::class, $address->updated_at);
$this->assertNotNull($address->_id);
$this->assertInternalType('string', $address->_id);
$this->assertIsString($address->_id);
$raw = $address->getAttributes();
$this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
$this->assertInstanceOf(ObjectId::class, $raw['_id']);
$address = $user->addresses()->save(new Address(['city' => 'Paris']));
$user = User::find($user->_id);
$this->assertEquals(['London', 'Paris'], $user->addresses->pluck('city')->all());
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($address), $address);
$events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.updating: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('dispatch')->once()->with('eloquent.updated: ' . get_class($address), $address);
$events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($address), $address);
$address->city = 'New York';
$user->addresses()->save($address);
......@@ -68,9 +85,9 @@ class EmbeddedRelationsTest extends TestCase
$address = $user->addresses->first();
$this->assertEquals('London', $address->city);
$this->assertInstanceOf('DateTime', $address->created_at);
$this->assertInstanceOf('DateTime', $address->updated_at);
$this->assertInstanceOf('User', $address->user);
$this->assertInstanceOf(DateTime::class, $address->created_at);
$this->assertInstanceOf(DateTime::class, $address->updated_at);
$this->assertInstanceOf(User::class, $address->user);
$this->assertEmpty($address->relationsToArray()); // prevent infinite loop
$user = User::find($user->_id);
......@@ -91,19 +108,19 @@ class EmbeddedRelationsTest extends TestCase
// $user = User::create(['name' => 'John Doe']);
// $address = new Address(['city' => 'London']);
// $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
// $address->setEventDispatcher($events = Mockery::mock(\Illuminate\Events\Dispatcher::class));
// $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
// $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(true);
// $events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($address), $address);
// $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
// $events->shouldReceive('dispatch')->once()->with('eloquent.created: ' . get_class($address), $address);
// $events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($address), $address);
// $address->save();
// $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
// $address->setEventDispatcher($events = Mockery::mock(\Illuminate\Events\Dispatcher::class));
// $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
// $events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(true);
// $events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($address), $address);
// $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
// $events->shouldReceive('dispatch')->once()->with('eloquent.updated: ' . get_class($address), $address);
// $events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($address), $address);
// $address->city = 'Paris';
// $address->save();
......@@ -175,29 +192,29 @@ class EmbeddedRelationsTest extends TestCase
{
$user = User::create([]);
$address = $user->addresses()->create(['city' => 'Bruxelles']);
$this->assertInstanceOf('Address', $address);
$this->assertInternalType('string', $address->_id);
$this->assertInstanceOf(Address::class, $address);
$this->assertIsString($address->_id);
$this->assertEquals(['Bruxelles'], $user->addresses->pluck('city')->all());
$raw = $address->getAttributes();
$this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
$this->assertInstanceOf(ObjectId::class, $raw['_id']);
$freshUser = User::find($user->id);
$this->assertEquals(['Bruxelles'], $freshUser->addresses->pluck('city')->all());
$user = User::create([]);
$address = $user->addresses()->create(['_id' => '', 'city' => 'Bruxelles']);
$this->assertInternalType('string', $address->_id);
$this->assertIsString($address->_id);
$raw = $address->getAttributes();
$this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
$this->assertInstanceOf(ObjectId::class, $raw['_id']);
}
public function testEmbedsManyCreateMany()
{
$user = User::create([]);
list($bruxelles, $paris) = $user->addresses()->createMany([['city' => 'Bruxelles'], ['city' => 'Paris']]);
$this->assertInstanceOf('Address', $bruxelles);
$this->assertInstanceOf(Address::class, $bruxelles);
$this->assertEquals('Bruxelles', $bruxelles->city);
$this->assertEquals(['Bruxelles', 'Paris'], $user->addresses->pluck('city')->all());
......@@ -208,14 +225,23 @@ class EmbeddedRelationsTest extends TestCase
public function testEmbedsManyDestroy()
{
$user = User::create(['name' => 'John Doe']);
$user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
$user->addresses()->saveMany([
new Address(['city' => 'London']),
new Address(['city' => 'Bristol']),
new Address(['city' => 'Bruxelles']),
]);
$address = $user->addresses->first();
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::type('Address'))->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.deleted: ' . get_class($address), Mockery::type('Address'));
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.deleting: ' . get_class($address), Mockery::type(Address::class))
->andReturn(true);
$events->shouldReceive('dispatch')
->once()
->with('eloquent.deleted: ' . get_class($address), Mockery::type(Address::class));
$user->addresses()->destroy($address->_id);
$this->assertEquals(['Bristol', 'Bruxelles'], $user->addresses->pluck('city')->all());
......@@ -239,7 +265,11 @@ class EmbeddedRelationsTest extends TestCase
$freshUser = User::find($user->id);
$this->assertEquals([], $freshUser->addresses->pluck('city')->all());
list($london, $bristol, $bruxelles) = $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
list($london, $bristol, $bruxelles) = $user->addresses()->saveMany([
new Address(['city' => 'London']),
new Address(['city' => 'Bristol']),
new Address(['city' => 'Bruxelles']),
]);
$user->addresses()->destroy([$london, $bruxelles]);
$this->assertEquals(['Bristol'], $user->addresses->pluck('city')->all());
}
......@@ -247,14 +277,23 @@ class EmbeddedRelationsTest extends TestCase
public function testEmbedsManyDelete()
{
$user = User::create(['name' => 'John Doe']);
$user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
$user->addresses()->saveMany([
new Address(['city' => 'London']),
new Address(['city' => 'Bristol']),
new Address(['city' => 'Bruxelles']),
]);
$address = $user->addresses->first();
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::type('Address'))->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.deleted: ' . get_class($address), Mockery::type('Address'));
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.deleting: ' . get_class($address), Mockery::type(Address::class))
->andReturn(true);
$events->shouldReceive('dispatch')
->once()
->with('eloquent.deleted: ' . get_class($address), Mockery::type(Address::class));
$address->delete();
......@@ -300,10 +339,16 @@ class EmbeddedRelationsTest extends TestCase
$user = User::create(['name' => 'John Doe']);
$address = new Address(['city' => 'London']);
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(false);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.creating: ' . get_class($address), $address)
->andReturn(false);
$this->assertFalse($user->addresses()->save($address));
$address->unsetEventDispatcher();
......@@ -315,9 +360,12 @@ class EmbeddedRelationsTest extends TestCase
$address = new Address(['city' => 'Paris']);
$address->exists = true;
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(false);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($address), $address)
->andReturn(false);
$this->assertFalse($user->addresses()->save($address));
$address->unsetEventDispatcher();
......@@ -329,10 +377,16 @@ class EmbeddedRelationsTest extends TestCase
$address = new Address(['city' => 'New York']);
$user->addresses()->save($address);
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(false);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($address), $address)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.updating: ' . get_class($address), $address)
->andReturn(false);
$address->city = 'Warsaw';
......@@ -347,9 +401,12 @@ class EmbeddedRelationsTest extends TestCase
$address = $user->addresses->first();
$address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::mustBe($address))->andReturn(false);
$address->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($address), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.deleting: ' . get_class($address), Mockery::mustBe($address))
->andReturn(false);
$this->assertEquals(0, $user->addresses()->destroy($address));
$this->assertEquals(['New York'], $user->addresses->pluck('city')->all());
......@@ -387,14 +444,14 @@ class EmbeddedRelationsTest extends TestCase
$relations = $user->getRelations();
$this->assertArrayNotHasKey('addresses', $relations);
$this->assertArrayHasKey('addresses', $user->toArray());
$this->assertInternalType('array', $user->toArray()['addresses']);
$this->assertIsArray($user->toArray()['addresses']);
$user = User::with('addresses')->get()->first();
$relations = $user->getRelations();
$this->assertArrayHasKey('addresses', $relations);
$this->assertEquals(2, $relations['addresses']->count());
$this->assertArrayHasKey('addresses', $user->toArray());
$this->assertInternalType('array', $user->toArray()['addresses']);
$this->assertIsArray($user->toArray()['addresses']);
}
public function testEmbedsManyDeleteAll()
......@@ -424,22 +481,52 @@ class EmbeddedRelationsTest extends TestCase
public function testEmbedsManyCollectionMethods()
{
$user = User::create(['name' => 'John Doe']);
$user->addresses()->save(new Address(['city' => 'Paris', 'country' => 'France', 'visited' => 4, 'created_at' => new DateTime('3 days ago')]));
$user->addresses()->save(new Address(['city' => 'Bruges', 'country' => 'Belgium', 'visited' => 7, 'created_at' => new DateTime('5 days ago')]));
$user->addresses()->save(new Address(['city' => 'Brussels', 'country' => 'Belgium', 'visited' => 2, 'created_at' => new DateTime('4 days ago')]));
$user->addresses()->save(new Address(['city' => 'Ghent', 'country' => 'Belgium', 'visited' => 13, 'created_at' => new DateTime('2 days ago')]));
$user->addresses()->save(new Address([
'city' => 'Paris',
'country' => 'France',
'visited' => 4,
'created_at' => new DateTime('3 days ago'),
]));
$user->addresses()->save(new Address([
'city' => 'Bruges',
'country' => 'Belgium',
'visited' => 7,
'created_at' => new DateTime('5 days ago'),
]));
$user->addresses()->save(new Address([
'city' => 'Brussels',
'country' => 'Belgium',
'visited' => 2,
'created_at' => new DateTime('4 days ago'),
]));
$user->addresses()->save(new Address([
'city' => 'Ghent',
'country' => 'Belgium',
'visited' => 13,
'created_at' => new DateTime('2 days ago'),
]));
$this->assertEquals(['Paris', 'Bruges', 'Brussels', 'Ghent'], $user->addresses()->pluck('city')->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent', 'Paris'], $user->addresses()->sortBy('city')->pluck('city')->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent', 'Paris'], $user->addresses()
->sortBy('city')
->pluck('city')
->all());
$this->assertEquals([], $user->addresses()->where('city', 'New York')->pluck('city')->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()->where('country', 'Belgium')->pluck('city')->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()->where('country', 'Belgium')->sortBy('city')->pluck('city')->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()
->where('country', 'Belgium')
->pluck('city')
->all());
$this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()
->where('country', 'Belgium')
->sortBy('city')
->pluck('city')
->all());
$results = $user->addresses->first();
$this->assertInstanceOf('Address', $results);
$this->assertInstanceOf(Address::class, $results);
$results = $user->addresses()->where('country', 'Belgium');
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $results);
$this->assertInstanceOf(Collection::class, $results);
$this->assertEquals(3, $results->count());
$results = $user->addresses()->whereIn('visited', [7, 13]);
......@@ -451,32 +538,44 @@ class EmbeddedRelationsTest extends TestCase
$user = User::create(['name' => 'John Doe']);
$father = new User(['name' => 'Mark Doe']);
$father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($father), $father);
$events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
$father->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.creating: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('dispatch')->once()->with('eloquent.created: ' . get_class($father), $father);
$events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($father), $father);
$father = $user->father()->save($father);
$father->unsetEventDispatcher();
$this->assertNotNull($user->father);
$this->assertEquals('Mark Doe', $user->father->name);
$this->assertInstanceOf('DateTime', $father->created_at);
$this->assertInstanceOf('DateTime', $father->updated_at);
$this->assertInstanceOf(DateTime::class, $father->created_at);
$this->assertInstanceOf(DateTime::class, $father->updated_at);
$this->assertNotNull($father->_id);
$this->assertInternalType('string', $father->_id);
$this->assertIsString($father->_id);
$raw = $father->getAttributes();
$this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
$father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($father), $father);
$events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
$this->assertInstanceOf(ObjectId::class, $raw['_id']);
$father->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.updating: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('dispatch')->once()->with('eloquent.updated: ' . get_class($father), $father);
$events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($father), $father);
$father->name = 'Tom Doe';
$user->father()->save($father);
......@@ -487,12 +586,18 @@ class EmbeddedRelationsTest extends TestCase
$father = new User(['name' => 'Jim Doe']);
$father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($father), $father)->andReturn(true);
$events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($father), $father);
$events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
$father->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')
->once()
->with('eloquent.saving: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('until')
->once()
->with('eloquent.creating: ' . get_class($father), $father)
->andReturn(true);
$events->shouldReceive('dispatch')->once()->with('eloquent.created: ' . get_class($father), $father);
$events->shouldReceive('dispatch')->once()->with('eloquent.saved: ' . get_class($father), $father);
$father = $user->father()->save($father);
$father->unsetEventDispatcher();
......@@ -506,8 +611,8 @@ class EmbeddedRelationsTest extends TestCase
$user = User::create(['name' => 'John Doe']);
$father = new User(['name' => 'Mark Doe']);
$father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
$events->shouldReceive('fire')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$father->setEventDispatcher($events = Mockery::mock(Dispatcher::class));
$events->shouldReceive('dispatch')->with('eloquent.retrieved: ' . get_class($father), Mockery::any());
$events->shouldReceive('until')->times(0)->with('eloquent.saving: ' . get_class($father), $father);
$father = $user->father()->associate($father);
......@@ -534,6 +639,7 @@ class EmbeddedRelationsTest extends TestCase
public function testEmbedsManyToArray()
{
/** @var User $user */
$user = User::create(['name' => 'John Doe']);
$user->addresses()->save(new Address(['city' => 'New York']));
$user->addresses()->save(new Address(['city' => 'Paris']));
......@@ -541,12 +647,14 @@ class EmbeddedRelationsTest extends TestCase
$array = $user->toArray();
$this->assertArrayHasKey('addresses', $array);
$this->assertInternalType('array', $array['addresses']);
$this->assertIsArray($array['addresses']);
}
public function testEmbeddedSave()
{
/** @var User $user */
$user = User::create(['name' => 'John Doe']);
/** @var \Address $address */
$address = $user->addresses()->create(['city' => 'New York']);
$father = $user->father()->create(['name' => 'Mark Doe']);
......
<?php
declare(strict_types=1);
class GeospatialTest extends TestCase
{
public function setUp()
public function setUp(): void
{
parent::setUp();
......@@ -43,7 +44,7 @@ class GeospatialTest extends TestCase
]);
}
public function tearDown()
public function tearDown(): void
{
Schema::drop('locations');
}
......@@ -53,7 +54,8 @@ class GeospatialTest extends TestCase
$locations = Location::where('location', 'geoWithin', [
'$geometry' => [
'type' => 'Polygon',
'coordinates' => [[
'coordinates' => [
[
[
-0.1450383,
51.5069158,
......@@ -74,7 +76,8 @@ class GeospatialTest extends TestCase
-0.1450383,
51.5069158,
],
]],
],
],
],
]);
......@@ -104,7 +107,7 @@ class GeospatialTest extends TestCase
51.5078646,
],
],
]
],
]);
$this->assertEquals(1, $locations->count());
......
<?php
declare(strict_types=1);
use Illuminate\Database\MySqlConnection;
class HybridRelationsTest extends TestCase
{
public function setUp()
public function setUp(): void
{
parent::setUp();
......@@ -11,7 +14,7 @@ class HybridRelationsTest extends TestCase
MysqlRole::executeSchema();
}
public function tearDown()
public function tearDown(): void
{
MysqlUser::truncate();
MysqlBook::truncate();
......@@ -21,13 +24,13 @@ class HybridRelationsTest extends TestCase
public function testMysqlRelations()
{
$user = new MysqlUser;
$this->assertInstanceOf('MysqlUser', $user);
$this->assertInstanceOf('Illuminate\Database\MySqlConnection', $user->getConnection());
$this->assertInstanceOf(MysqlUser::class, $user);
$this->assertInstanceOf(MySqlConnection::class, $user->getConnection());
// Mysql User
$user->name = "John Doe";
$user->save();
$this->assertInternalType('int', $user->id);
$this->assertIsInt($user->id);
// SQL has many
$book = new Book(['title' => 'Game of Thrones']);
......@@ -79,10 +82,10 @@ class HybridRelationsTest extends TestCase
{
$user = new MysqlUser;
$otherUser = new MysqlUser;
$this->assertInstanceOf('MysqlUser', $user);
$this->assertInstanceOf('Illuminate\Database\MySqlConnection', $user->getConnection());
$this->assertInstanceOf('MysqlUser', $otherUser);
$this->assertInstanceOf('Illuminate\Database\MySqlConnection', $otherUser->getConnection());
$this->assertInstanceOf(MysqlUser::class, $user);
$this->assertInstanceOf(MySqlConnection::class, $user->getConnection());
$this->assertInstanceOf(MysqlUser::class, $otherUser);
$this->assertInstanceOf(MySqlConnection::class, $otherUser->getConnection());
//MySql User
$user->name = "John Doe";
......@@ -93,8 +96,8 @@ class HybridRelationsTest extends TestCase
$otherUser->id = 3;
$otherUser->save();
// Make sure they are created
$this->assertInternalType('int', $user->id);
$this->assertInternalType('int', $otherUser->id);
$this->assertIsInt($user->id);
$this->assertIsInt($otherUser->id);
// Clear to start
$user->books()->truncate();
$otherUser->books()->truncate();
......@@ -133,10 +136,10 @@ class HybridRelationsTest extends TestCase
{
$user = new MysqlUser;
$otherUser = new MysqlUser;
$this->assertInstanceOf('MysqlUser', $user);
$this->assertInstanceOf('Illuminate\Database\MySqlConnection', $user->getConnection());
$this->assertInstanceOf('MysqlUser', $otherUser);
$this->assertInstanceOf('Illuminate\Database\MySqlConnection', $otherUser->getConnection());
$this->assertInstanceOf(MysqlUser::class, $user);
$this->assertInstanceOf(MySqlConnection::class, $user->getConnection());
$this->assertInstanceOf(MysqlUser::class, $otherUser);
$this->assertInstanceOf(MySqlConnection::class, $otherUser->getConnection());
//MySql User
$user->name = "John Doe";
......@@ -147,8 +150,8 @@ class HybridRelationsTest extends TestCase
$otherUser->id = 3;
$otherUser->save();
// Make sure they are created
$this->assertInternalType('int', $user->id);
$this->assertInternalType('int', $otherUser->id);
$this->assertIsInt($user->id);
$this->assertIsInt($otherUser->id);
// Clear to start
Book::truncate();
MysqlBook::truncate();
......
<?php
declare(strict_types=1);
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Jenssegers\Mongodb\Eloquent\Model;
use MongoDB\BSON\ObjectID;
use MongoDB\BSON\UTCDateTime;
class ModelTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
User::truncate();
Soft::truncate();
......@@ -16,17 +18,17 @@ class ModelTest extends TestCase
Item::truncate();
}
public function testNewModel()
public function testNewModel(): void
{
$user = new User;
$this->assertInstanceOf(Model::class, $user);
$this->assertInstanceOf('Jenssegers\Mongodb\Connection', $user->getConnection());
$this->assertInstanceOf(\Jenssegers\Mongodb\Connection::class, $user->getConnection());
$this->assertFalse($user->exists);
$this->assertEquals('users', $user->getTable());
$this->assertEquals('_id', $user->getKeyName());
}
public function testInsert()
public function testInsert(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -39,7 +41,7 @@ class ModelTest extends TestCase
$this->assertEquals(1, User::count());
$this->assertTrue(isset($user->_id));
$this->assertInternalType('string', $user->_id);
$this->assertIsString($user->_id);
$this->assertNotEquals('', (string) $user->_id);
$this->assertNotEquals(0, strlen((string) $user->_id));
$this->assertInstanceOf(Carbon::class, $user->created_at);
......@@ -51,7 +53,7 @@ class ModelTest extends TestCase
$this->assertEquals(35, $user->age);
}
public function testUpdate()
public function testUpdate(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -62,8 +64,8 @@ class ModelTest extends TestCase
$raw = $user->getAttributes();
$this->assertInstanceOf(ObjectID::class, $raw['_id']);
/** @var User $check */
$check = User::find($user->_id);
$check->age = 36;
$check->save();
......@@ -84,7 +86,7 @@ class ModelTest extends TestCase
$this->assertEquals(20, $check->age);
}
public function testManualStringId()
public function testManualStringId(): void
{
$user = new User;
$user->_id = '4af9f23d8ead0e1d32000000';
......@@ -110,10 +112,10 @@ class ModelTest extends TestCase
$this->assertEquals('customId', $user->_id);
$raw = $user->getAttributes();
$this->assertInternalType('string', $raw['_id']);
$this->assertIsString($raw['_id']);
}
public function testManualIntId()
public function testManualIntId(): void
{
$user = new User;
$user->_id = 1;
......@@ -126,10 +128,10 @@ class ModelTest extends TestCase
$this->assertEquals(1, $user->_id);
$raw = $user->getAttributes();
$this->assertInternalType('integer', $raw['_id']);
$this->assertIsInt($raw['_id']);
}
public function testDelete()
public function testDelete(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -145,7 +147,7 @@ class ModelTest extends TestCase
$this->assertEquals(0, User::count());
}
public function testAll()
public function testAll(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -166,7 +168,7 @@ class ModelTest extends TestCase
$this->assertContains('Jane Doe', $all->pluck('name'));
}
public function testFind()
public function testFind(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -174,6 +176,7 @@ class ModelTest extends TestCase
$user->age = 35;
$user->save();
/** @var User $check */
$check = User::find($user->_id);
$this->assertInstanceOf(Model::class, $check);
......@@ -184,7 +187,7 @@ class ModelTest extends TestCase
$this->assertEquals(35, $check->age);
}
public function testGet()
public function testGet(): void
{
User::insert([
['name' => 'John Doe'],
......@@ -197,19 +200,20 @@ class ModelTest extends TestCase
$this->assertInstanceOf(Model::class, $users[0]);
}
public function testFirst()
public function testFirst(): void
{
User::insert([
['name' => 'John Doe'],
['name' => 'Jane Doe'],
]);
/** @var User $user */
$user = User::first();
$this->assertInstanceOf(Model::class, $user);
$this->assertEquals('John Doe', $user->name);
}
public function testNoDocument()
public function testNoDocument(): void
{
$items = Item::where('name', 'nothing')->get();
$this->assertInstanceOf(Collection::class, $items);
......@@ -222,25 +226,27 @@ class ModelTest extends TestCase
$this->assertNull($item);
}
public function testFindOrfail()
public function testFindOrFail(): void
{
$this->expectException(Illuminate\Database\Eloquent\ModelNotFoundException::class);
User::findOrfail('51c33d8981fec6813e00000a');
$this->expectException(ModelNotFoundException::class);
User::findOrFail('51c33d8981fec6813e00000a');
}
public function testCreate()
public function testCreate(): void
{
/** @var User $user */
$user = User::create(['name' => 'Jane Poe']);
$this->assertInstanceOf(Model::class, $user);
$this->assertTrue($user->exists);
$this->assertEquals('Jane Poe', $user->name);
/** @var User $check */
$check = User::where('name', 'Jane Poe')->first();
$this->assertEquals($user->_id, $check->_id);
}
public function testDestroy()
public function testDestroy(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -253,7 +259,7 @@ class ModelTest extends TestCase
$this->assertEquals(0, User::count());
}
public function testTouch()
public function testTouch(): void
{
$user = new User;
$user->name = 'John Doe';
......@@ -262,21 +268,23 @@ class ModelTest extends TestCase
$user->save();
$old = $user->updated_at;
sleep(1);
$user->touch();
/** @var User $check */
$check = User::find($user->_id);
$this->assertNotEquals($old, $check->updated_at);
}
public function testSoftDelete()
public function testSoftDelete(): void
{
Soft::create(['name' => 'John Doe']);
Soft::create(['name' => 'Jane Doe']);
$this->assertEquals(2, Soft::count());
/** @var Soft $user */
$user = Soft::where('name', 'John Doe')->first();
$this->assertTrue($user->exists);
$this->assertFalse($user->trashed());
......@@ -301,7 +309,7 @@ class ModelTest extends TestCase
$this->assertEquals(2, Soft::count());
}
public function testPrimaryKey()
public function testPrimaryKey(): void
{
$user = new User;
$this->assertEquals('_id', $user->getKeyName());
......@@ -315,13 +323,14 @@ class ModelTest extends TestCase
$this->assertEquals('A Game of Thrones', $book->getKey());
/** @var Book $check */
$check = Book::find('A Game of Thrones');
$this->assertEquals('title', $check->getKeyName());
$this->assertEquals('A Game of Thrones', $check->getKey());
$this->assertEquals('A Game of Thrones', $check->title);
}
public function testScope()
public function testScope(): void
{
Item::insert([
['name' => 'knife', 'type' => 'sharp'],
......@@ -332,7 +341,7 @@ class ModelTest extends TestCase
$this->assertEquals(1, $sharp->count());
}
public function testToArray()
public function testToArray(): void
{
$item = Item::create(['name' => 'fork', 'type' => 'sharp']);
......@@ -340,12 +349,12 @@ class ModelTest extends TestCase
$keys = array_keys($array);
sort($keys);
$this->assertEquals(['_id', 'created_at', 'name', 'type', 'updated_at'], $keys);
$this->assertInternalType('string', $array['created_at']);
$this->assertInternalType('string', $array['updated_at']);
$this->assertInternalType('string', $array['_id']);
$this->assertIsString($array['created_at']);
$this->assertIsString($array['updated_at']);
$this->assertIsString($array['_id']);
}
public function testUnset()
public function testUnset(): void
{
$user1 = User::create(['name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
$user2 = User::create(['name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
......@@ -372,7 +381,7 @@ class ModelTest extends TestCase
$this->assertObjectNotHasAttribute('note2', $user2);
}
public function testDates()
public function testDates(): void
{
$birthday = new DateTime('1980/1/1');
$user = User::create(['name' => 'John Doe', 'birthday' => $birthday]);
......@@ -399,10 +408,12 @@ class ModelTest extends TestCase
$this->assertLessThan(2, abs(time() - $item->created_at->getTimestamp()));
// test default date format for json output
/** @var Item $item */
$item = Item::create(['name' => 'sword']);
$json = $item->toArray();
$this->assertEquals($item->created_at->format('Y-m-d H:i:s'), $json['created_at']);
/** @var User $user */
$user = User::create(['name' => 'Jane Doe', 'birthday' => time()]);
$this->assertInstanceOf(Carbon::class, $user->birthday);
......@@ -423,8 +434,9 @@ class ModelTest extends TestCase
$this->assertEquals((string) $user->getAttribute('entry.date')->format('Y-m-d H:i:s'), $data['entry']['date']);
}
public function testIdAttribute()
public function testIdAttribute(): void
{
/** @var User $user */
$user = User::create(['name' => 'John Doe']);
$this->assertEquals($user->id, $user->_id);
......@@ -432,8 +444,9 @@ class ModelTest extends TestCase
$this->assertNotEquals($user->id, $user->_id);
}
public function testPushPull()
public function testPushPull(): void
{
/** @var User $user */
$user = User::create(['name' => 'John Doe']);
$user->push('tags', 'tag1');
......@@ -458,36 +471,36 @@ class ModelTest extends TestCase
$this->assertEquals([], $user->tags);
}
public function testRaw()
public function testRaw(): void
{
User::create(['name' => 'John Doe', 'age' => 35]);
User::create(['name' => 'Jane Doe', 'age' => 35]);
User::create(['name' => 'Harry Hoe', 'age' => 15]);
$users = User::raw(function ($collection) {
$users = User::raw(function (\Jenssegers\Mongodb\Collection $collection) {
return $collection->find(['age' => 35]);
});
$this->assertInstanceOf(Collection::class, $users);
$this->assertInstanceOf(Model::class, $users[0]);
$user = User::raw(function ($collection) {
$user = User::raw(function (\Jenssegers\Mongodb\Collection $collection) {
return $collection->findOne(['age' => 35]);
});
$this->assertInstanceOf(Model::class, $user);
$count = User::raw(function ($collection) {
$count = User::raw(function (\Jenssegers\Mongodb\Collection $collection) {
return $collection->count();
});
$this->assertEquals(3, $count);
$result = User::raw(function ($collection) {
$result = User::raw(function (\Jenssegers\Mongodb\Collection $collection) {
return $collection->insertOne(['name' => 'Yvonne Yoe', 'age' => 35]);
});
$this->assertNotNull($result);
}
public function testDotNotation()
public function testDotNotation(): void
{
$user = User::create([
'name' => 'John Doe',
......@@ -509,8 +522,9 @@ class ModelTest extends TestCase
$this->assertEquals('Strasbourg', $user['address.city']);
}
public function testMultipleLevelDotNotation()
public function testMultipleLevelDotNotation(): void
{
/** @var Book $book */
$book = Book::create([
'title' => 'A Game of Thrones',
'chapters' => [
......@@ -525,7 +539,7 @@ class ModelTest extends TestCase
$this->assertEquals('The first chapter', $book['chapters.one.title']);
}
public function testGetDirtyDates()
public function testGetDirtyDates(): void
{
$user = new User();
$user->setRawAttributes(['name' => 'John Doe', 'birthday' => new DateTime('19 august 1989')], true);
......@@ -535,14 +549,14 @@ class ModelTest extends TestCase
$this->assertEmpty($user->getDirty());
}
public function testChunkById()
public function testChunkById(): void
{
User::create(['name' => 'fork', 'tags' => ['sharp', 'pointy']]);
User::create(['name' => 'spork', 'tags' => ['sharp', 'pointy', 'round', 'bowl']]);
User::create(['name' => 'spoon', 'tags' => ['round', 'bowl']]);
$count = 0;
User::chunkById(2, function ($items) use (&$count) {
User::chunkById(2, function (\Illuminate\Database\Eloquent\Collection $items) use (&$count) {
$count += count($items);
});
......
<?php
declare(strict_types=1);
use MongoDB\BSON\UTCDateTime;
use Illuminate\Support\Facades\DB;
use Jenssegers\Mongodb\Collection;
use Jenssegers\Mongodb\Query\Builder;
use MongoDB\BSON\ObjectId;
use MongoDB\BSON\Regex;
use MongoDB\BSON\UTCDateTime;
use MongoDB\Driver\Cursor;
class QueryBuilderTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
DB::collection('users')->truncate();
DB::collection('items')->truncate();
......@@ -40,14 +46,14 @@ class QueryBuilderTest extends TestCase
DB::collection('items')->where('user_id', $user_id)->delete($pid);
DB::collection('items')->where('user_id', $user_id)->delete(str_random(32));
DB::collection('items')->where('user_id', $user_id)->delete(md5('random-id'));
$this->assertEquals(2, DB::collection('items')->count());
}
public function testCollection()
{
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', DB::collection('users'));
$this->assertInstanceOf(Builder::class, DB::collection('users'));
}
public function testGet()
......@@ -85,13 +91,13 @@ class QueryBuilderTest extends TestCase
$user = $users[0];
$this->assertEquals('John Doe', $user['name']);
$this->assertInternalType('array', $user['tags']);
$this->assertIsArray($user['tags']);
}
public function testInsertGetId()
{
$id = DB::collection('users')->insertGetId(['name' => 'John Doe']);
$this->assertInstanceOf('MongoDB\BSON\ObjectID', $id);
$this->assertInstanceOf(ObjectId::class, $id);
}
public function testBatchInsert()
......@@ -109,7 +115,7 @@ class QueryBuilderTest extends TestCase
$users = DB::collection('users')->get();
$this->assertCount(2, $users);
$this->assertInternalType('array', $users[0]['tags']);
$this->assertIsArray($users[0]['tags']);
}
public function testFind()
......@@ -220,14 +226,14 @@ class QueryBuilderTest extends TestCase
return $collection->find(['age' => 20]);
});
$this->assertInstanceOf('MongoDB\Driver\Cursor', $cursor);
$this->assertInstanceOf(Cursor::class, $cursor);
$this->assertCount(1, $cursor->toArray());
$collection = DB::collection('users')->raw();
$this->assertInstanceOf('Jenssegers\Mongodb\Collection', $collection);
$this->assertInstanceOf(Collection::class, $collection);
$collection = User::raw();
$this->assertInstanceOf('Jenssegers\Mongodb\Collection', $collection);
$this->assertInstanceOf(Collection::class, $collection);
$results = DB::collection('users')->whereRaw(['age' => 20])->get();
$this->assertCount(1, $results);
......@@ -245,7 +251,7 @@ class QueryBuilderTest extends TestCase
DB::collection('users')->where('_id', $id)->push('tags', 'tag1');
$user = DB::collection('users')->find($id);
$this->assertInternalType('array', $user['tags']);
$this->assertIsArray($user['tags']);
$this->assertCount(1, $user['tags']);
$this->assertEquals('tag1', $user['tags'][0]);
......@@ -267,17 +273,25 @@ class QueryBuilderTest extends TestCase
$message = ['from' => 'Jane', 'body' => 'Hi John'];
DB::collection('users')->where('_id', $id)->push('messages', $message);
$user = DB::collection('users')->find($id);
$this->assertInternalType('array', $user['messages']);
$this->assertIsArray($user['messages']);
$this->assertCount(1, $user['messages']);
$this->assertEquals($message, $user['messages'][0]);
// Raw
DB::collection('users')->where('_id', $id)->push(['tags' => 'tag3', 'messages' => ['from' => 'Mark', 'body' => 'Hi John']]);
DB::collection('users')->where('_id', $id)->push([
'tags' => 'tag3',
'messages' => ['from' => 'Mark', 'body' => 'Hi John'],
]);
$user = DB::collection('users')->find($id);
$this->assertCount(4, $user['tags']);
$this->assertCount(2, $user['messages']);
DB::collection('users')->where('_id', $id)->push(['messages' => ['date' => new DateTime(), 'body' => 'Hi John']]);
DB::collection('users')->where('_id', $id)->push([
'messages' => [
'date' => new DateTime(),
'body' => 'Hi John',
],
]);
$user = DB::collection('users')->find($id);
$this->assertCount(3, $user['messages']);
}
......@@ -296,14 +310,14 @@ class QueryBuilderTest extends TestCase
DB::collection('users')->where('_id', $id)->pull('tags', 'tag3');
$user = DB::collection('users')->find($id);
$this->assertInternalType('array', $user['tags']);
$this->assertIsArray($user['tags']);
$this->assertCount(3, $user['tags']);
$this->assertEquals('tag4', $user['tags'][2]);
DB::collection('users')->where('_id', $id)->pull('messages', $message1);
$user = DB::collection('users')->find($id);
$this->assertInternalType('array', $user['messages']);
$this->assertIsArray($user['messages']);
$this->assertCount(1, $user['messages']);
// Raw
......@@ -457,7 +471,14 @@ class QueryBuilderTest extends TestCase
{
DB::collection('items')->insert([
['name' => 'knife', 'amount' => [['hidden' => 10, 'found' => 3], ['hidden' => 5, 'found' => 2]]],
['name' => 'fork', 'amount' => [['hidden' => 35, 'found' => 12], ['hidden' => 7, 'found' => 17], ['hidden' => 1, 'found' => 19]]],
[
'name' => 'fork',
'amount' => [
['hidden' => 35, 'found' => 12],
['hidden' => 7, 'found' => 17],
['hidden' => 1, 'found' => 19],
],
],
['name' => 'spoon', 'amount' => [['hidden' => 14, 'found' => 21]]],
['name' => 'teaspoon', 'amount' => []],
]);
......@@ -529,7 +550,9 @@ class QueryBuilderTest extends TestCase
['name' => 'Mark Moe', 'birthday' => new UTCDateTime(1000 * strtotime("1983-01-01 00:00:00"))],
]);
$user = DB::collection('users')->where('birthday', new UTCDateTime(1000 * strtotime("1980-01-01 00:00:00")))->first();
$user = DB::collection('users')
->where('birthday', new UTCDateTime(1000 * strtotime("1980-01-01 00:00:00")))
->first();
$this->assertEquals('John Doe', $user['name']);
$user = DB::collection('users')->where('birthday', '=', new DateTime("1980-01-01 00:00:00"))->first();
......@@ -701,4 +724,17 @@ class QueryBuilderTest extends TestCase
$this->assertEquals(1, count($result['tags']));
}
}
public function testValue()
{
DB::collection('books')->insert([
['title' => 'Moby-Dick', 'author' => ['first_name' => 'Herman', 'last_name' => 'Melville']],
]);
$this->assertEquals('Moby-Dick', DB::collection('books')->value('title'));
$this->assertEquals(['first_name' => 'Herman', 'last_name' => 'Melville'], DB::collection('books')
->value('author'));
$this->assertEquals('Herman', DB::collection('books')->value('author.first_name'));
$this->assertEquals('Melville', DB::collection('books')->value('author.last_name'));
}
}
<?php
declare(strict_types=1);
class QueryTest extends TestCase
{
protected static $started = false;
public function setUp()
public function setUp(): void
{
parent::setUp();
User::create(['name' => 'John Doe', 'age' => 35, 'title' => 'admin']);
......@@ -18,13 +19,14 @@ class QueryTest extends TestCase
User::create(['name' => 'Error', 'age' => null, 'title' => null]);
}
public function tearDown()
public function tearDown(): void
{
User::truncate();
Scoped::truncate();
parent::tearDown();
}
public function testWhere()
public function testWhere(): void
{
$users = User::where('age', 35)->get();
$this->assertCount(3, $users);
......@@ -45,7 +47,7 @@ class QueryTest extends TestCase
$this->assertCount(6, $users);
}
public function testAndWhere()
public function testAndWhere(): void
{
$users = User::where('age', 35)->where('title', 'admin')->get();
$this->assertCount(2, $users);
......@@ -54,7 +56,7 @@ class QueryTest extends TestCase
$this->assertCount(2, $users);
}
public function testLike()
public function testLike(): void
{
$users = User::where('name', 'like', '%doe')->get();
$this->assertCount(2, $users);
......@@ -69,7 +71,22 @@ class QueryTest extends TestCase
$this->assertCount(1, $users);
}
public function testSelect()
public function testNotLike(): void
{
$users = User::where('name', 'not like', '%doe')->get();
$this->assertCount(7, $users);
$users = User::where('name', 'not like', '%y%')->get();
$this->assertCount(6, $users);
$users = User::where('name', 'not LIKE', '%y%')->get();
$this->assertCount(6, $users);
$users = User::where('name', 'not like', 't%')->get();
$this->assertCount(8, $users);
}
public function testSelect(): void
{
$user = User::where('name', 'John Doe')->select('name')->first();
......@@ -95,7 +112,7 @@ class QueryTest extends TestCase
$this->assertNull($user->age);
}
public function testOrWhere()
public function testOrWhere(): void
{
$users = User::where('age', 13)->orWhere('title', 'admin')->get();
$this->assertCount(4, $users);
......@@ -104,7 +121,7 @@ class QueryTest extends TestCase
$this->assertCount(2, $users);
}
public function testBetween()
public function testBetween(): void
{
$users = User::whereBetween('age', [0, 25])->get();
$this->assertCount(2, $users);
......@@ -117,7 +134,7 @@ class QueryTest extends TestCase
$this->assertCount(6, $users);
}
public function testIn()
public function testIn(): void
{
$users = User::whereIn('age', [13, 23])->get();
$this->assertCount(2, $users);
......@@ -133,19 +150,19 @@ class QueryTest extends TestCase
$this->assertCount(3, $users);
}
public function testWhereNull()
public function testWhereNull(): void
{
$users = User::whereNull('age')->get();
$this->assertCount(1, $users);
}
public function testWhereNotNull()
public function testWhereNotNull(): void
{
$users = User::whereNotNull('age')->get();
$this->assertCount(8, $users);
}
public function testOrder()
public function testOrder(): void
{
$user = User::whereNotNull('age')->orderBy('age', 'asc')->first();
$this->assertEquals(13, $user->age);
......@@ -166,7 +183,7 @@ class QueryTest extends TestCase
$this->assertEquals(35, $user->age);
}
public function testGroupBy()
public function testGroupBy(): void
{
$users = User::groupBy('title')->get();
$this->assertCount(3, $users);
......@@ -196,7 +213,7 @@ class QueryTest extends TestCase
$this->assertNotNull($users[0]->name);
}
public function testCount()
public function testCount(): void
{
$count = User::where('age', '<>', 35)->count();
$this->assertEquals(6, $count);
......@@ -206,13 +223,13 @@ class QueryTest extends TestCase
$this->assertEquals(6, $count);
}
public function testExists()
public function testExists(): void
{
$this->assertFalse(User::where('age', '>', 37)->exists());
$this->assertTrue(User::where('age', '<', 37)->exists());
}
public function testSubquery()
public function testSubQuery(): void
{
$users = User::where('title', 'admin')->orWhere(function ($query) {
$query->where('name', 'Tommy Toe')
......@@ -261,7 +278,7 @@ class QueryTest extends TestCase
$this->assertEquals(5, $users->count());
}
public function testWhereRaw()
public function testWhereRaw(): void
{
$where = ['age' => ['$gt' => 30, '$lt' => 40]];
$users = User::whereRaw($where)->get();
......@@ -275,7 +292,7 @@ class QueryTest extends TestCase
$this->assertCount(6, $users);
}
public function testMultipleOr()
public function testMultipleOr(): void
{
$users = User::where(function ($query) {
$query->where('age', 35)->orWhere('age', 33);
......@@ -296,7 +313,7 @@ class QueryTest extends TestCase
$this->assertCount(2, $users);
}
public function testPaginate()
public function testPaginate(): void
{
$results = User::paginate(2);
$this->assertEquals(2, $results->count());
......@@ -309,4 +326,21 @@ class QueryTest extends TestCase
$this->assertEquals(9, $results->total());
$this->assertEquals(1, $results->currentPage());
}
public function testUpdate(): void
{
$this->assertEquals(1, User::where(['name' => 'John Doe'])->update(['name' => 'Jim Morrison']));
$this->assertEquals(1, User::where(['name' => 'Jim Morrison'])->count());
Scoped::create(['favorite' => true]);
Scoped::create(['favorite' => false]);
$this->assertCount(1, Scoped::get());
$this->assertEquals(1, Scoped::query()->update(['name' => 'Johnny']));
$this->assertCount(1, Scoped::withoutGlobalScopes()->where(['name' => 'Johnny'])->get());
$this->assertCount(2, Scoped::withoutGlobalScopes()->get());
$this->assertEquals(2, Scoped::withoutGlobalScopes()->update(['name' => 'Jimmy']));
$this->assertCount(2, Scoped::withoutGlobalScopes()->where(['name' => 'Jimmy'])->get());
}
}
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Queue\Failed\MongoFailedJobProvider;
class QueueTest extends TestCase
{
public function setUp()
public function setUp(): void
{
parent::setUp();
......@@ -11,7 +14,7 @@ class QueueTest extends TestCase
Queue::getDatabase()->table(Config::get('queue.failed.table'))->truncate();
}
public function testQueueJobLifeCycle()
public function testQueueJobLifeCycle(): void
{
$id = Queue::push('test', ['action' => 'QueueJobLifeCycle'], 'test');
$this->assertNotNull($id);
......@@ -24,6 +27,7 @@ class QueueTest extends TestCase
'displayName' => 'test',
'job' => 'test',
'maxTries' => null,
'delay' => null,
'timeout' => null,
'data' => ['action' => 'QueueJobLifeCycle'],
]), $job->getRawBody());
......@@ -33,7 +37,7 @@ class QueueTest extends TestCase
$this->assertEquals(0, Queue::getDatabase()->table(Config::get('queue.connections.database.table'))->count());
}
public function testQueueJobExpired()
public function testQueueJobExpired(): void
{
$id = Queue::push('test', ['action' => 'QueueJobExpired'], 'test');
$this->assertNotNull($id);
......@@ -53,4 +57,38 @@ class QueueTest extends TestCase
$job->delete();
$this->assertEquals(0, Queue::getDatabase()->table(Config::get('queue.connections.database.table'))->count());
}
public function testFailQueueJob(): void
{
$provider = app('queue.failer');
$this->assertInstanceOf(MongoFailedJobProvider::class, $provider);
}
public function testFindFailJobNull(): void
{
Config::set('queue.failed.database', 'mongodb');
$provider = app('queue.failer');
$this->assertNull($provider->find(1));
}
public function testIncrementAttempts(): void
{
$job_id = Queue::push('test1', ['action' => 'QueueJobExpired'], 'test');
$this->assertNotNull($job_id);
$job_id = Queue::push('test2', ['action' => 'QueueJobExpired'], 'test');
$this->assertNotNull($job_id);
$job = Queue::pop('test');
$this->assertEquals(1, $job->attempts());
$job->delete();
$others_jobs = Queue::getDatabase()
->table(Config::get('queue.connections.database.table'))
->get();
$this->assertCount(1, $others_jobs);
$this->assertEquals(0, $others_jobs[0]['attempts']);
}
}
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Collection;
class RelationsTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
Mockery::close();
......@@ -17,7 +20,7 @@ class RelationsTest extends TestCase
Photo::truncate();
}
public function testHasMany()
public function testHasMany(): void
{
$author = User::create(['name' => 'George R. R. Martin']);
Book::create(['title' => 'A Game of Thrones', 'author_id' => $author->_id]);
......@@ -36,7 +39,7 @@ class RelationsTest extends TestCase
$this->assertCount(3, $items);
}
public function testBelongsTo()
public function testBelongsTo(): void
{
$user = User::create(['name' => 'George R. R. Martin']);
Book::create(['title' => 'A Game of Thrones', 'author_id' => $user->_id]);
......@@ -55,7 +58,7 @@ class RelationsTest extends TestCase
$this->assertNull($book->author);
}
public function testHasOne()
public function testHasOne(): void
{
$user = User::create(['name' => 'John Doe']);
Role::create(['type' => 'admin', 'user_id' => $user->_id]);
......@@ -78,7 +81,7 @@ class RelationsTest extends TestCase
$this->assertEquals($user->_id, $role->user_id);
}
public function testWithBelongsTo()
public function testWithBelongsTo(): void
{
$user = User::create(['name' => 'John Doe']);
Item::create(['type' => 'knife', 'user_id' => $user->_id]);
......@@ -89,13 +92,13 @@ class RelationsTest extends TestCase
$items = Item::with('user')->orderBy('user_id', 'desc')->get();
$user = $items[0]->getRelation('user');
$this->assertInstanceOf('User', $user);
$this->assertInstanceOf(User::class, $user);
$this->assertEquals('John Doe', $user->name);
$this->assertCount(1, $items[0]->getRelations());
$this->assertNull($items[3]->getRelation('user'));
}
public function testWithHashMany()
public function testWithHashMany(): void
{
$user = User::create(['name' => 'John Doe']);
Item::create(['type' => 'knife', 'user_id' => $user->_id]);
......@@ -107,10 +110,10 @@ class RelationsTest extends TestCase
$items = $user->getRelation('items');
$this->assertCount(3, $items);
$this->assertInstanceOf('Item', $items[0]);
$this->assertInstanceOf(Item::class, $items[0]);
}
public function testWithHasOne()
public function testWithHasOne(): void
{
$user = User::create(['name' => 'John Doe']);
Role::create(['type' => 'admin', 'user_id' => $user->_id]);
......@@ -119,11 +122,11 @@ class RelationsTest extends TestCase
$user = User::with('role')->find($user->_id);
$role = $user->getRelation('role');
$this->assertInstanceOf('Role', $role);
$this->assertInstanceOf(Role::class, $role);
$this->assertEquals('admin', $role->type);
}
public function testEasyRelation()
public function testEasyRelation(): void
{
// Has Many
$user = User::create(['name' => 'John Doe']);
......@@ -133,7 +136,7 @@ class RelationsTest extends TestCase
$user = User::find($user->_id);
$items = $user->items;
$this->assertCount(1, $items);
$this->assertInstanceOf('Item', $items[0]);
$this->assertInstanceOf(Item::class, $items[0]);
$this->assertEquals($user->_id, $items[0]->user_id);
// Has one
......@@ -143,12 +146,12 @@ class RelationsTest extends TestCase
$user = User::find($user->_id);
$role = $user->role;
$this->assertInstanceOf('Role', $role);
$this->assertInstanceOf(Role::class, $role);
$this->assertEquals('admin', $role->type);
$this->assertEquals($user->_id, $role->user_id);
}
public function testBelongsToMany()
public function testBelongsToMany(): void
{
$user = User::create(['name' => 'John Doe']);
......@@ -167,18 +170,18 @@ class RelationsTest extends TestCase
$clients = $user->getRelation('clients');
$users = $client->getRelation('users');
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $users);
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $clients);
$this->assertInstanceOf('Client', $clients[0]);
$this->assertInstanceOf('User', $users[0]);
$this->assertInstanceOf(Collection::class, $users);
$this->assertInstanceOf(Collection::class, $clients);
$this->assertInstanceOf(Client::class, $clients[0]);
$this->assertInstanceOf(User::class, $users[0]);
$this->assertCount(2, $user->clients);
$this->assertCount(1, $client->users);
// Now create a new user to an existing client
$user = $client->users()->create(['name' => 'Jane Doe']);
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user->clients);
$this->assertInstanceOf('Client', $user->clients->first());
$this->assertInstanceOf(Collection::class, $user->clients);
$this->assertInstanceOf(Client::class, $user->clients->first());
$this->assertCount(1, $user->clients);
// Get user and unattached client
......@@ -186,8 +189,8 @@ class RelationsTest extends TestCase
$client = Client::Where('name', '=', 'Buffet Bar Inc.')->first();
// Check the models are what they should be
$this->assertInstanceOf('Client', $client);
$this->assertInstanceOf('User', $user);
$this->assertInstanceOf(Client::class, $client);
$this->assertInstanceOf(User::class, $user);
// Assert they are not attached
$this->assertNotContains($client->_id, $user->client_ids);
......@@ -222,7 +225,7 @@ class RelationsTest extends TestCase
$this->assertCount(1, $client->users);
}
public function testBelongsToManyAttachesExistingModels()
public function testBelongsToManyAttachesExistingModels(): void
{
$user = User::create(['name' => 'John Doe', 'client_ids' => ['1234523']]);
......@@ -261,7 +264,7 @@ class RelationsTest extends TestCase
$this->assertStringStartsWith('synced', $user->clients[1]->name);
}
public function testBelongsToManySync()
public function testBelongsToManySync(): void
{
// create test instances
$user = User::create(['name' => 'John Doe']);
......@@ -280,7 +283,7 @@ class RelationsTest extends TestCase
$this->assertCount(1, $user->clients);
}
public function testBelongsToManyAttachArray()
public function testBelongsToManyAttachArray(): void
{
$user = User::create(['name' => 'John Doe']);
$client1 = Client::create(['name' => 'Test 1'])->_id;
......@@ -291,7 +294,7 @@ class RelationsTest extends TestCase
$this->assertCount(2, $user->clients);
}
public function testBelongsToManyAttachEloquentCollection()
public function testBelongsToManyAttachEloquentCollection(): void
{
$user = User::create(['name' => 'John Doe']);
$client1 = Client::create(['name' => 'Test 1']);
......@@ -303,7 +306,7 @@ class RelationsTest extends TestCase
$this->assertCount(2, $user->clients);
}
public function testBelongsToManySyncAlreadyPresent()
public function testBelongsToManySyncAlreadyPresent(): void
{
$user = User::create(['name' => 'John Doe']);
$client1 = Client::create(['name' => 'Test 1'])->_id;
......@@ -320,7 +323,7 @@ class RelationsTest extends TestCase
$this->assertCount(1, $user['client_ids']);
}
public function testBelongsToManyCustom()
public function testBelongsToManyCustom(): void
{
$user = User::create(['name' => 'John Doe']);
$group = $user->groups()->create(['name' => 'Admins']);
......@@ -340,7 +343,7 @@ class RelationsTest extends TestCase
$this->assertEquals($user->_id, $group->users()->first()->_id);
}
public function testMorph()
public function testMorph(): void
{
$user = User::create(['name' => 'John Doe']);
$client = Client::create(['name' => 'Jane Doe']);
......@@ -376,14 +379,14 @@ class RelationsTest extends TestCase
$photos = Photo::with('imageable')->get();
$relations = $photos[0]->getRelations();
$this->assertArrayHasKey('imageable', $relations);
$this->assertInstanceOf('User', $photos[0]->imageable);
$this->assertInstanceOf(User::class, $photos[0]->imageable);
$relations = $photos[1]->getRelations();
$this->assertArrayHasKey('imageable', $relations);
$this->assertInstanceOf('Client', $photos[1]->imageable);
$this->assertInstanceOf(Client::class, $photos[1]->imageable);
}
public function testHasManyHas()
public function testHasManyHas(): void
{
$author1 = User::create(['name' => 'George R. R. Martin']);
$author1->books()->create(['title' => 'A Game of Thrones', 'rating' => 5]);
......@@ -433,7 +436,7 @@ class RelationsTest extends TestCase
$this->assertCount(1, $authors);
}
public function testHasOneHas()
public function testHasOneHas(): void
{
$user1 = User::create(['name' => 'John Doe']);
$user1->role()->create(['title' => 'admin']);
......@@ -455,7 +458,7 @@ class RelationsTest extends TestCase
$this->assertCount(2, $users);
}
public function testNestedKeys()
public function testNestedKeys(): void
{
$client = Client::create([
'data' => [
......@@ -481,7 +484,7 @@ class RelationsTest extends TestCase
$this->assertEquals('Paris', $client->addresses->first()->data['city']);
}
public function testDoubleSaveOneToMany()
public function testDoubleSaveOneToMany(): void
{
$author = User::create(['name' => 'George R. R. Martin']);
$book = Book::create(['title' => 'A Game of Thrones']);
......@@ -504,7 +507,7 @@ class RelationsTest extends TestCase
$this->assertEquals($author->_id, $book->author_id);
}
public function testDoubleSaveManyToMany()
public function testDoubleSaveManyToMany(): void
{
$user = User::create(['name' => 'John Doe']);
$client = Client::create(['name' => 'Admins']);
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Schema\Blueprint;
class SchemaTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
Schema::drop('newcollection');
Schema::drop('newcollection_two');
}
public function testCreate()
public function testCreate(): void
{
Schema::create('newcollection');
$this->assertTrue(Schema::hasCollection('newcollection'));
$this->assertTrue(Schema::hasTable('newcollection'));
}
public function testCreateWithCallback()
public function testCreateWithCallback(): void
{
$instance = $this;
Schema::create('newcollection', function ($collection) use ($instance) {
$instance->assertInstanceOf('Jenssegers\Mongodb\Schema\Blueprint', $collection);
$instance->assertInstanceOf(Blueprint::class, $collection);
});
$this->assertTrue(Schema::hasCollection('newcollection'));
}
public function testDrop()
public function testCreateWithOptions(): void
{
Schema::create('newcollection_two', null, ['capped' => true, 'size' => 1024]);
$this->assertTrue(Schema::hasCollection('newcollection_two'));
$this->assertTrue(Schema::hasTable('newcollection_two'));
}
public function testDrop(): void
{
Schema::create('newcollection');
Schema::drop('newcollection');
$this->assertFalse(Schema::hasCollection('newcollection'));
}
public function testBluePrint()
public function testBluePrint(): void
{
$instance = $this;
Schema::collection('newcollection', function ($collection) use ($instance) {
$instance->assertInstanceOf('Jenssegers\Mongodb\Schema\Blueprint', $collection);
$instance->assertInstanceOf(Blueprint::class, $collection);
});
Schema::table('newcollection', function ($collection) use ($instance) {
$instance->assertInstanceOf('Jenssegers\Mongodb\Schema\Blueprint', $collection);
$instance->assertInstanceOf(Blueprint::class, $collection);
});
}
public function testIndex()
public function testIndex(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->index('mykey1');
......@@ -69,7 +80,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['key']['mykey3']);
}
public function testPrimary()
public function testPrimary(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->string('mykey', 100)->primary();
......@@ -79,7 +90,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['unique']);
}
public function testUnique()
public function testUnique(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->unique('uniquekey');
......@@ -89,7 +100,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['unique']);
}
public function testDropIndex()
public function testDropIndex(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->unique('uniquekey');
......@@ -136,7 +147,77 @@ class SchemaTest extends TestCase
$this->assertFalse($index);
}
public function testBackground()
public function testDropIndexIfExists(): void
{
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->unique('uniquekey');
$collection->dropIndexIfExists('uniquekey_1');
});
$index = $this->getIndex('newcollection', 'uniquekey');
$this->assertEquals(null, $index);
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->unique('uniquekey');
$collection->dropIndexIfExists(['uniquekey']);
});
$index = $this->getIndex('newcollection', 'uniquekey');
$this->assertEquals(null, $index);
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->index(['field_a', 'field_b']);
});
$index = $this->getIndex('newcollection', 'field_a_1_field_b_1');
$this->assertNotNull($index);
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->dropIndexIfExists(['field_a', 'field_b']);
});
$index = $this->getIndex('newcollection', 'field_a_1_field_b_1');
$this->assertFalse($index);
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->index(['field_a', 'field_b'], 'custom_index_name');
});
$index = $this->getIndex('newcollection', 'custom_index_name');
$this->assertNotNull($index);
Schema::collection('newcollection', function (Blueprint $collection) {
$collection->dropIndexIfExists('custom_index_name');
});
$index = $this->getIndex('newcollection', 'custom_index_name');
$this->assertFalse($index);
}
public function testHasIndex(): void
{
$instance = $this;
Schema::collection('newcollection', function (Blueprint $collection) use ($instance) {
$collection->index('myhaskey1');
$instance->assertTrue($collection->hasIndex('myhaskey1_1'));
$instance->assertFalse($collection->hasIndex('myhaskey1'));
});
Schema::collection('newcollection', function (Blueprint $collection) use ($instance) {
$collection->index('myhaskey2');
$instance->assertTrue($collection->hasIndex(['myhaskey2']));
$instance->assertFalse($collection->hasIndex(['myhaskey2_1']));
});
Schema::collection('newcollection', function (Blueprint $collection) use ($instance) {
$collection->index(['field_a', 'field_b']);
$instance->assertTrue($collection->hasIndex(['field_a_1_field_b']));
$instance->assertFalse($collection->hasIndex(['field_a_1_field_b_1']));
});
}
public function testBackground(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->background('backgroundkey');
......@@ -146,7 +227,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['background']);
}
public function testSparse()
public function testSparse(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->sparse('sparsekey');
......@@ -156,7 +237,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['sparse']);
}
public function testExpire()
public function testExpire(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->expire('expirekey', 60);
......@@ -166,7 +247,7 @@ class SchemaTest extends TestCase
$this->assertEquals(60, $index['expireAfterSeconds']);
}
public function testSoftDeletes()
public function testSoftDeletes(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->softDeletes();
......@@ -180,7 +261,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['key']['email']);
}
public function testFluent()
public function testFluent(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->string('email')->index();
......@@ -195,7 +276,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['key']['token']);
}
public function testGeospatial()
public function testGeospatial(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->geospatial('point');
......@@ -213,15 +294,16 @@ class SchemaTest extends TestCase
$this->assertEquals('2dsphere', $index['key']['continent']);
}
public function testDummies()
public function testDummies(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->boolean('activated')->default(0);
$collection->integer('user_id')->unsigned();
});
$this->expectNotToPerformAssertions();
}
public function testSparseUnique()
public function testSparseUnique(): void
{
Schema::collection('newcollection', function ($collection) {
$collection->sparse_and_unique('sparseuniquekey');
......@@ -232,7 +314,7 @@ class SchemaTest extends TestCase
$this->assertEquals(1, $index['unique']);
}
protected function getIndex($collection, $name)
protected function getIndex(string $collection, string $name)
{
$collection = DB::getCollection($collection);
......
<?php
declare(strict_types=1);
class SeederTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
User::truncate();
}
public function testSeed()
public function testSeed(): void
{
$seeder = new UserTableSeeder;
$seeder->run();
......@@ -16,7 +17,7 @@ class SeederTest extends TestCase
$this->assertTrue($user->seed);
}
public function testArtisan()
public function testArtisan(): void
{
Artisan::call('db:seed');
......
<?php
declare(strict_types=1);
use Illuminate\Auth\Passwords\PasswordResetServiceProvider;
class TestCase extends Orchestra\Testbench\TestCase
{
/**
* Get application providers.
*
* @param \Illuminate\Foundation\Application $app
*
* @return array
*/
protected function getApplicationProviders($app)
{
$providers = parent::getApplicationProviders($app);
unset($providers[array_search('Illuminate\Auth\Passwords\PasswordResetServiceProvider', $providers)]);
unset($providers[array_search(PasswordResetServiceProvider::class, $providers)]);
return $providers;
}
/**
* Get package providers.
*
* @param \Illuminate\Foundation\Application $app
* @return array
*/
......@@ -28,14 +28,14 @@ class TestCase extends Orchestra\Testbench\TestCase
{
return [
Jenssegers\Mongodb\MongodbServiceProvider::class,
Jenssegers\Mongodb\MongodbQueueServiceProvider::class,
Jenssegers\Mongodb\Auth\PasswordResetServiceProvider::class,
Jenssegers\Mongodb\Validation\ValidationServiceProvider::class
Jenssegers\Mongodb\Validation\ValidationServiceProvider::class,
];
}
/**
* Define environment setup.
*
* @param Illuminate\Foundation\Application $app
* @return void
*/
......@@ -51,6 +51,7 @@ class TestCase extends Orchestra\Testbench\TestCase
$app['config']->set('database.default', 'mongodb');
$app['config']->set('database.connections.mysql', $config['connections']['mysql']);
$app['config']->set('database.connections.mongodb', $config['connections']['mongodb']);
$app['config']->set('database.connections.mongodb2', $config['connections']['mongodb']);
$app['config']->set('database.connections.dsn_mongodb', $config['connections']['dsn_mongodb']);
$app['config']->set('auth.model', 'User');
......@@ -64,5 +65,6 @@ class TestCase extends Orchestra\Testbench\TestCase
'queue' => 'default',
'expire' => 60,
]);
$app['config']->set('queue.failed.database', 'mongodb2');
}
}
<?php
declare(strict_types=1);
class ValidationTest extends TestCase
{
public function tearDown()
public function tearDown(): void
{
User::truncate();
}
public function testUnique()
public function testUnique(): void
{
$validator = Validator::make(
['name' => 'John Doe'],
......@@ -42,7 +43,7 @@ class ValidationTest extends TestCase
$this->assertFalse($validator->fails());
}
public function testExists()
public function testExists(): void
{
$validator = Validator::make(
['name' => 'John Doe'],
......
<?php
$mongoHost = env('MONGO_HOST', 'mongodb');
$mongoPort = env('MONGO_PORT') ? (int) env('MONGO_PORT') : 27017;
return [
'connections' => [
......@@ -7,22 +10,22 @@ return [
'mongodb' => [
'name' => 'mongodb',
'driver' => 'mongodb',
'host' => 'mongodb',
'database' => 'unittest',
'host' => $mongoHost,
'database' => env('MONGO_DATABASE', 'unittest'),
],
'dsn_mongodb' => [
'driver' => 'mongodb',
'dsn' => 'mongodb://mongodb:27017',
'database' => 'unittest',
'dsn' => "mongodb://$mongoHost:$mongoPort",
'database' => env('MONGO_DATABASE', 'unittest'),
],
'mysql' => [
'driver' => 'mysql',
'host' => 'mysql',
'database' => 'unittest',
'username' => 'root',
'password' => '',
'host' => env('MYSQL_HOST', 'mysql'),
'database' => env('MYSQL_DATABASE', 'unittest'),
'username' => env('MYSQL_USERNAME', 'root'),
'password' => env('MYSQL_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
......
......@@ -2,7 +2,7 @@
return [
'default' => 'database',
'default' => env('QUEUE_CONNECTION'),
'connections' => [
......@@ -16,7 +16,7 @@ return [
],
'failed' => [
'database' => 'mongodb',
'database' => env('MONGO_DATABASE'),
'table' => 'failed_jobs',
],
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Jenssegers\Mongodb\Relations\EmbedsMany;
class Address extends Eloquent
{
protected $connection = 'mongodb';
protected static $unguarded = true;
public function addresses()
public function addresses(): EmbedsMany
{
return $this->embedsMany('Address');
}
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
/**
* Class Book
* @property string $title
* @property string $author
* @property array $chapters
*/
class Book extends Eloquent
{
protected $connection = 'mongodb';
......@@ -9,12 +17,12 @@ class Book extends Eloquent
protected static $unguarded = true;
protected $primaryKey = 'title';
public function author()
public function author(): BelongsTo
{
return $this->belongsTo('User', 'author_id');
}
public function mysqlAuthor()
public function mysqlAuthor(): BelongsTo
{
return $this->belongsTo('MysqlUser', 'author_id');
}
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Client extends Eloquent
......@@ -8,17 +12,17 @@ class Client extends Eloquent
protected $collection = 'clients';
protected static $unguarded = true;
public function users()
public function users(): BelongsToMany
{
return $this->belongsToMany('User');
}
public function photo()
public function photo(): MorphOne
{
return $this->morphOne('Photo', 'imageable');
}
public function addresses()
public function addresses(): HasMany
{
return $this->hasMany('Address', 'data.client_id', 'data.client_id');
}
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Group extends Eloquent
......@@ -8,7 +10,7 @@ class Group extends Eloquent
protected $collection = 'groups';
protected static $unguarded = true;
public function users()
public function users(): BelongsToMany
{
return $this->belongsToMany('User', 'users', 'groups', 'users', '_id', '_id', 'users');
}
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Jenssegers\Mongodb\Eloquent\Builder;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
/**
* Class Item
* @property \Carbon\Carbon $created_at
*/
class Item extends Eloquent
{
protected $connection = 'mongodb';
protected $collection = 'items';
protected static $unguarded = true;
public function user()
public function user(): BelongsTo
{
return $this->belongsTo('User');
}
public function scopeSharp($query)
public function scopeSharp(Builder $query)
{
return $query->where('type', 'sharp');
}
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
......@@ -12,7 +15,7 @@ class MysqlBook extends Eloquent
protected static $unguarded = true;
protected $primaryKey = 'title';
public function author()
public function author(): BelongsTo
{
return $this->belongsTo('User', 'author_id');
}
......@@ -20,12 +23,13 @@ class MysqlBook extends Eloquent
/**
* Check if we need to run the schema.
*/
public static function executeSchema()
public static function executeSchema(): void
{
/** @var \Illuminate\Database\Schema\MySqlBuilder $schema */
$schema = Schema::connection('mysql');
if (!$schema->hasTable('books')) {
Schema::connection('mysql')->create('books', function ($table) {
Schema::connection('mysql')->create('books', function (Blueprint $table) {
$table->string('title');
$table->string('author_id')->nullable();
$table->integer('mysql_user_id')->unsigned()->nullable();
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
......@@ -11,12 +14,12 @@ class MysqlRole extends Eloquent
protected $table = 'roles';
protected static $unguarded = true;
public function user()
public function user(): BelongsTo
{
return $this->belongsTo('User');
}
public function mysqlUser()
public function mysqlUser(): BelongsTo
{
return $this->belongsTo('MysqlUser');
}
......@@ -26,10 +29,11 @@ class MysqlRole extends Eloquent
*/
public static function executeSchema()
{
/** @var \Illuminate\Database\Schema\MySqlBuilder $schema */
$schema = Schema::connection('mysql');
if (!$schema->hasTable('roles')) {
Schema::connection('mysql')->create('roles', function ($table) {
Schema::connection('mysql')->create('roles', function (Blueprint $table) {
$table->string('type');
$table->string('user_id');
$table->timestamps();
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
......@@ -11,17 +15,17 @@ class MysqlUser extends Eloquent
protected $table = 'users';
protected static $unguarded = true;
public function books()
public function books(): HasMany
{
return $this->hasMany('Book', 'author_id');
}
public function role()
public function role(): HasOne
{
return $this->hasOne('Role');
}
public function mysqlBooks()
public function mysqlBooks(): HasMany
{
return $this->hasMany(MysqlBook::class);
}
......@@ -29,12 +33,13 @@ class MysqlUser extends Eloquent
/**
* Check if we need to run the schema.
*/
public static function executeSchema()
public static function executeSchema(): void
{
/** @var \Illuminate\Database\Schema\MySqlBuilder $schema */
$schema = Schema::connection('mysql');
if (!$schema->hasTable('users')) {
Schema::connection('mysql')->create('users', function ($table) {
Schema::connection('mysql')->create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Photo extends Eloquent
......@@ -8,7 +10,7 @@ class Photo extends Eloquent
protected $collection = 'photos';
protected static $unguarded = true;
public function imageable()
public function imageable(): MorphTo
{
return $this->morphTo();
}
......
<?php
declare(strict_types=1);
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Role extends Eloquent
......@@ -8,12 +10,12 @@ class Role extends Eloquent
protected $collection = 'roles';
protected static $unguarded = true;
public function user()
public function user(): BelongsTo
{
return $this->belongsTo('User');
}
public function mysqlUser()
public function mysqlUser(): BelongsTo
{
return $this->belongsTo('MysqlUser');
}
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Eloquent\Builder;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Scoped extends Eloquent
{
protected $connection = 'mongodb';
protected $collection = 'scoped';
protected $fillable = ['name', 'favorite'];
protected static function boot()
{
parent::boot();
static::addGlobalScope('favorite', function (Builder $builder) {
$builder->where('favorite', true);
});
}
}
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Jenssegers\Mongodb\Eloquent\SoftDeletes;
/**
* Class Soft
* @property \Carbon\Carbon $deleted_at
*/
class Soft extends Eloquent
{
use SoftDeletes;
......
<?php
declare(strict_types=1);
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Notifications\Notifiable;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
/**
* Class User
* @property string $_id
* @property string $name
* @property string $title
* @property int $age
* @property \Carbon\Carbon $birthday
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
*/
class User extends Eloquent implements AuthenticatableContract, CanResetPasswordContract
{
use Authenticatable, CanResetPassword, HybridRelations;
use Authenticatable, CanResetPassword, HybridRelations, Notifiable;
protected $connection = 'mongodb';
protected $dates = ['birthday', 'entry.date'];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment