Skip to content

Commit

Permalink
qualify scope columns
Browse files Browse the repository at this point in the history
  • Loading branch information
iamgergo committed Feb 25, 2021
1 parent 4a4b6fb commit 74ca990
Show file tree
Hide file tree
Showing 20 changed files with 125 additions and 85 deletions.
11 changes: 6 additions & 5 deletions src/Concerns/Filterable.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function scopeFilter(Builder $query, Request $request): Builder
{
foreach ($request->except('filter') as $name => $value) {
if ($this->hasNamedScope($name) && ! is_null($value)) {
$query = $this->callNamedScope($name, [$query, $value]);
$this->callNamedScope($name, [$query, $value]);
}
}

Expand All @@ -46,12 +46,12 @@ public function scopeFilter(Builder $query, Request $request): Builder
* Exclude the given models from the query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int|string|array $value
* @param array $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeExclude(Builder $query, $value): Builder
public function scopeExclude(Builder $query, array $value): Builder
{
return $query->whereNotIn('id', (array) $value);
return $query->whereNotIn($query->qualifyColumn('id'), $value);
}

/**
Expand Down Expand Up @@ -87,7 +87,8 @@ public function scopeState(Builder $query, string $value): Builder
public function scopeSort(Builder $query, array $value = []): Builder
{
return $query->orderBy(
$value['by'] ?? 'created_at', $value['order'] ?? 'desc'
$query->qualifyColumn($value['by'] ?? 'created_at'),
$value['order'] ?? 'desc'
);
}
}
2 changes: 1 addition & 1 deletion src/Models/Address.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,6 @@ public function toBreadcrumb(Request $request): string
*/
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where('alias', 'like', "{$value}%");
return $query->where($query->qualifyColumn('alias'), 'like', "{$value}%");
}
}
9 changes: 4 additions & 5 deletions src/Models/Cart.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public function unlock(): void
*/
public function scopeLocked(Builder $query): Builder
{
return $query->where('locked', true);
return $query->where($query->qualifyColumn('locked'), true);
}

/**
Expand All @@ -129,7 +129,7 @@ public function scopeLocked(Builder $query): Builder
*/
public function scopeUnlocked(Builder $query): Builder
{
return $query->where('locked', false);
return $query->where($query->qualifyColumn('locked'), false);
}

/**
Expand All @@ -140,8 +140,7 @@ public function scopeUnlocked(Builder $query): Builder
*/
public function scopeExpired(Builder $query): Builder
{
return $query->whereNull('user_id')->where(
'updated_at', '<', Carbon::now()->subDays(3)
);
return $query->whereNull($query->qualifyColumn('user_id'))
->where($query->qualifyColumn('updated_at'), '<', Carbon::now()->subDays(3));
}
}
2 changes: 1 addition & 1 deletion src/Models/Category.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,6 @@ public function toBreadcrumb(Request $request): string
*/
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where('name', 'like', "{$value}%");
return $query->where($query->qualifyColumn('name'), 'like', "{$value}%");
}
}
6 changes: 3 additions & 3 deletions src/Models/Medium.php
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public function url(string $conversion = null): string
*/
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where('name', 'like', "{$value}%");
return $query->where($query->qualifyColumn('name'), 'like', "{$value}%");
}

/**
Expand All @@ -202,9 +202,9 @@ public function scopeType(Builder $query, string $value): Builder
{
switch ($value) {
case 'image':
return $query->where('mime_type', 'like', 'image%');
return $query->where($query->qualifyColumn('mime_type'), 'like', 'image%');
case 'file':
return $query->where('mime_type', 'not like', 'image%');
return $query->where($query->qualifyColumn('mime_type'), 'not like', 'image%');
default:
return $query;
}
Expand Down
6 changes: 3 additions & 3 deletions src/Models/Order.php
Original file line number Diff line number Diff line change
Expand Up @@ -288,12 +288,12 @@ public function scopeSearch(Builder $query, string $value): Builder
* Scope a query to only include orders with the given status.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array|string $status
* @param string $status
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeStatus(Builder $query, $status): Builder
public function scopeStatus(Builder $query, string $status): Builder
{
return $query->whereIn('status', (array) $status);
return $query->where($query->qualifyColumn('status'), $status);
}

/**
Expand Down
26 changes: 24 additions & 2 deletions src/Models/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,8 @@ public function resolveChildRouteBinding($childType, $value, $field): ?Model
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where(static function (Builder $query) use ($value): Builder {
return $query->where('name', 'like', "{$value}%")
->orWhere('inventory->sku', 'like', "{$value}%");
return $query->where($query->qualifyColumn('name'), 'like', "{$value}%")
->orWhere($query->qualifyColumn('inventory->sku'), 'like', "{$value}%");
});
}

Expand All @@ -244,4 +244,26 @@ public function scopeCategory(Builder $query, int $value): Builder
return $query->where($query->getModel()->qualifyColumn('id'), $value);
});
}

/**
* Scope the query only to the models that are out of stock.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeOutOfStock(Builder $query): Builder
{
return $query->where($query->qualifyColumn('inventory->quantity'), '=', 0);
}

/**
* Scope the query only to the models that are in stock.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeInStock(Builder $query): Builder
{
return $query->where($query->qualifyColumn('inventory->quantity'), '>', 0);
}
}
8 changes: 4 additions & 4 deletions src/Models/Transaction.php
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public function driver(string $driver): Contract
*/
public function scopePayment(Builder $query): Builder
{
return $query->where('type', 'payment');
return $query->where($query->qualifyColumn('type'), 'payment');
}

/**
Expand All @@ -173,7 +173,7 @@ public function scopePayment(Builder $query): Builder
*/
public function scopeRefund(Builder $query): Builder
{
return $query->where('type', 'refund');
return $query->where($query->qualifyColumn('type'), 'refund');
}

/**
Expand All @@ -184,7 +184,7 @@ public function scopeRefund(Builder $query): Builder
*/
public function scopeCompleted(Builder $query): Builder
{
return $query->whereNotNull('completed_at');
return $query->whereNotNull($query->qualifyColumn('completed_at'));
}

/**
Expand All @@ -195,6 +195,6 @@ public function scopeCompleted(Builder $query): Builder
*/
public function scopePending(Builder $query): Builder
{
return $query->whereNull('completed_at');
return $query->whereNull($query->qualifyColumn('completed_at'));
}
}
4 changes: 2 additions & 2 deletions src/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ public function toBreadcrumb(Request $request): string
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where(static function (Builder $query) use ($value): Builder {
return $query->where('name', 'like', "{$value}%")
->orWhere('email', 'like', "{$value}%");
return $query->where($query->qualifyColumn('name'), 'like', "{$value}%")
->orWhere($query->qualifyColumn('email'), 'like', "{$value}%");
});
}
}
2 changes: 1 addition & 1 deletion src/Models/Variant.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,6 @@ public function price(string $type = 'default', string $currency = null): ?float
*/
public function scopeSearch(Builder $query, string $value): Builder
{
return $query->where('alias', 'like', "{$value}%");
return $query->where($query->qualifyColumn('alias'), 'like', "{$value}%");
}
}
2 changes: 1 addition & 1 deletion tests/Unit/AddressTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ public function it_has_query_scopes()
$address->addressable()->associate($this->user)->save();

$this->assertSame(
$address->newQuery()->where('alias', 'like', 'test%')->toSql(),
$address->newQuery()->where('bazar_addresses.alias', 'like', 'test%')->toSql(),
$address->newQuery()->search('test')->toSql()
);
}
Expand Down
11 changes: 6 additions & 5 deletions tests/Unit/CartTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,19 +111,20 @@ public function it_can_be_locked()
public function it_has_query_scopes()
{
$this->assertSame(
$this->cart->newQuery()->where('locked', true)->toSql(),
$this->cart->newQuery()->where('bazar_carts.locked', true)->toSql(),
$this->cart->newQuery()->locked()->toSql()
);

$this->assertSame(
$this->cart->newQuery()->where('locked', false)->toSql(),
$this->cart->newQuery()->where('bazar_carts.locked', false)->toSql(),
$this->cart->newQuery()->unlocked()->toSql()
);

$this->assertSame(
$this->cart->newQuery()->whereNull('user_id')->where(
'updated_at', '<', Carbon::now()->subDays(3)
)->toSql(),
$this->cart->newQuery()
->whereNull('bazar_carts.user_id')
->where('bazar_carts.updated_at', '<', Carbon::now()->subDays(3))
->toSql(),
$this->cart->newQuery()->expired()->toSql()
);
}
Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/CategoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function it_is_breadcrumbable()
public function it_has_query_scopes()
{
$this->assertSame(
$this->category->newQuery()->where('name', 'like', 'test%')->toSql(),
$this->category->newQuery()->where('bazar_categories.name', 'like', 'test%')->toSql(),
$this->category->newQuery()->search('test')->toSql()
);
}
Expand Down
83 changes: 45 additions & 38 deletions tests/Unit/FilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,16 @@ public function a_product_query_can_be_filtered()
'category' => 1,
]);

$query = Product::query()->where(function ($query) {
$query->where('name', 'like', 'test%')
->orWhere('inventory->sku', 'like', 'test%');
})->withTrashed()
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc')
->whereHas('categories', function ($query) {
return $query->where('bazar_categories.id', 1);
});
$query = Product::query()
->where(function ($query) {
$query->where('bazar_products.name', 'like', 'test%')
->orWhere('bazar_products.inventory->sku', 'like', 'test%');
})->withTrashed()
->whereNotIn('bazar_products.id', [1, 2])
->orderBy('bazar_products.created_at', 'desc')
->whereHas('categories', function ($query) {
return $query->where('bazar_categories.id', 1);
});

$this->assertSame(
$query->toSql(), Product::filter($request)->toSql()
Expand All @@ -52,16 +53,17 @@ public function an_order_query_can_be_filtered()
'user' => 1,
]);

$query = Order::query()->whereHas('address', function ($query) {
$query->where('bazar_addresses.first_name', 'like', 'test%')
->orWhere('bazar_addresses.last_name', 'like', 'test%');
})->withTrashed()
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc')
->whereIn('status', ['in_progress'])
->whereHas('user', function ($query) {
return $query->where('users.id', 1);
});
$query = Order::query()
->whereHas('address', function ($query) {
$query->where('bazar_addresses.first_name', 'like', 'test%')
->orWhere('bazar_addresses.last_name', 'like', 'test%');
})->withTrashed()
->whereNotIn('bazar_orders.id', [1, 2])
->orderBy('bazar_orders.created_at', 'desc')
->where('bazar_orders.status', 'in_progress')
->whereHas('user', function ($query) {
return $query->where('users.id', 1);
});

$this->assertSame(
$query->toSql(), Order::filter($request)->toSql()
Expand All @@ -79,10 +81,11 @@ public function a_medium_query_can_be_filtered()
'type' => 'image',
]);

$query = Medium::query()->where('name', 'like', 'test%')
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc')
->where('mime_type', 'like', 'image%');
$query = Medium::query()
->where('bazar_media.name', 'like', 'test%')
->whereNotIn('bazar_media.id', [1, 2])
->orderBy('bazar_media.created_at', 'desc')
->where('bazar_media.mime_type', 'like', 'image%');

$this->assertSame(
$query->toSql(), Medium::filter($request)->toSql()
Expand All @@ -98,9 +101,10 @@ public function an_address_query_can_be_filtered()
'sort' => ['by' => 'created_at', 'order' => 'desc'],
]);

$query = Address::query()->where('alias', 'like', 'test%')
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc');
$query = Address::query()
->where('bazar_addresses.alias', 'like', 'test%')
->whereNotIn('bazar_addresses.id', [1, 2])
->orderBy('bazar_addresses.created_at', 'desc');

$this->assertSame(
$query->toSql(), Address::filter($request)->toSql()
Expand All @@ -116,9 +120,10 @@ public function a_category_query_can_be_filtered()
'sort' => ['by' => 'created_at', 'order' => 'desc'],
]);

$query = Category::query()->where('name', 'like', 'test%')
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc');
$query = Category::query()
->where('bazar_categories.name', 'like', 'test%')
->whereNotIn('bazar_categories.id', [1, 2])
->orderBy('bazar_categories.created_at', 'desc');

$this->assertSame(
$query->toSql(), Category::filter($request)->toSql()
Expand All @@ -135,11 +140,12 @@ public function a_user_query_can_be_filtered()
'sort' => ['by' => 'created_at', 'order' => 'desc'],
]);

$query = User::query()->where(function ($query) {
$query->where('name', 'like', 'test%')
->orWhere('email', 'like', 'test%');
})->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc');
$query = User::query()
->where(function ($query) {
$query->where('users.name', 'like', 'test%')
->orWhere('users.email', 'like', 'test%');
})->whereNotIn('users.id', [1, 2])
->orderBy('users.created_at', 'desc');

$this->assertSame(
$query->toSql(), User::filter($request)->toSql()
Expand All @@ -156,10 +162,11 @@ public function a_variant_query_can_be_filtered()
'sort' => ['by' => 'created_at', 'order' => 'desc'],
]);

$query = Variant::query()->where('alias', 'like', 'test%')
->onlyTrashed()
->whereNotIn('id', [1, 2])
->orderBy('created_at', 'desc');
$query = Variant::query()
->where('bazar_variants.alias', 'like', 'test%')
->onlyTrashed()
->whereNotIn('bazar_variants.id', [1, 2])
->orderBy('bazar_variants.created_at', 'desc');

$this->assertSame(
$query->toSql(), Variant::filter($request)->toSql()
Expand Down
Loading

0 comments on commit 74ca990

Please sign in to comment.