80 lines
2.3 KiB
PHP
80 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Scopes;
|
|
|
|
|
|
use App\Models\Purchase\Bill;
|
|
use App\Models\Sale\Invoice;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Scope;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class ReplaceDeprecatedColumns implements Scope
|
|
{
|
|
/**
|
|
* Apply the scope to a given Eloquent query builder.
|
|
*
|
|
* @param Builder $builder
|
|
* @param Model $model
|
|
*
|
|
* @return void
|
|
*/
|
|
public function apply(Builder $builder, Model $model)
|
|
{
|
|
switch (get_class($model)) {
|
|
case Invoice::class:
|
|
$replacements = [
|
|
'invoiced_at' => 'issued_at',
|
|
'invoice_number' => 'document_number',
|
|
];
|
|
break;
|
|
case Bill::class:
|
|
$replacements = [
|
|
'billed_at' => 'issued_at',
|
|
'bill_number' => 'document_number',
|
|
];
|
|
break;
|
|
}
|
|
|
|
if (false === isset($replacements)) {
|
|
return;
|
|
}
|
|
|
|
|
|
$query = $builder->getQuery();
|
|
|
|
foreach ($replacements as $column => $replace) {
|
|
if ($query->orders !== null) {
|
|
$query->orders = $this->replaceColumn($query->orders, $column, $replace);
|
|
}
|
|
|
|
if ($query->wheres !== null) {
|
|
$query->wheres = $this->replaceColumn($query->wheres, $column, $replace);
|
|
}
|
|
|
|
if ($query->havings !== null) {
|
|
$query->havings = $this->replaceColumn($query->havings, $column, $replace);
|
|
}
|
|
|
|
if ($query->unionOrders !== null) {
|
|
$query->unionOrders = $this->replaceColumn($query->unionOrders, $column, $replace);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function replaceColumn(array $columns, string $column, string $replace): array
|
|
{
|
|
return Collection::make($columns)
|
|
->transform(
|
|
function ($item) use ($column, $replace) {
|
|
if (isset($item['column']) && $item['column'] === $column) {
|
|
$item['column'] = $replace;
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
)->values()->all();
|
|
}
|
|
}
|