File: /var/www/ipsremont-demo/app/Repository/Device/DeviceRepository.php
<?php
namespace App\Repository\Device;
use App\Http\Requests\Device\IndexRequest;
use App\Models\Category;
use App\Models\Device;
use App\Models\DevicesSchema;
use App\Models\Schema;
use App\Repository\BaseRepository;
use App\Repository\Schema\SchemaRepository;
use App\Traits\GridTrait;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class DeviceRepository extends BaseRepository
{
use GridTrait;
/**
* @return Builder
*/
public static function getQuery(): Builder
{
return Device::query();
}
/**
* @param IndexRequest $request
*
* @return mixed
*/
public function search(IndexRequest $request)
{
$query = self::getAvailable();
$this->makeQueryOrdered(Device::class, $query, $request);
if (isset($request->id) && !empty($request->id)) {
$query->where('category_code', 'like', '%' . $request->id . '%');
}
if (isset($request->name) && !empty($request->name)) {
$query->where('name', 'like', '%' . $request->name . '%');
}
if (isset($request->external_id) && !empty($request->external_id)) {
$query->where('external_id', 'like', '%' . $request->external_id . '%');
}
$perPage = $request->per_page ?? 20;
return $query->paginate((int) $perPage)->appends($request->all());
}
public function search_specifications(IndexRequest $request)
{
$query = self::getAvailable();
$this->makeQueryOrdered(Device::class, $query, $request);
if (isset($request->id) && !empty($request->id)) {
$category = Category::where('code', $request->id)->first();
$same_categories = Category::where('name', $category->name)->get()->pluck('code')->toArray();
if ($same_categories) {
$query->where(function ($query) use ($same_categories) {
foreach ($same_categories as $category) {
$query->orWhere('category_code', $category);
}
});
} else {
$query->where('category_code', $request->id);
}
}
if (isset($request->name) && !empty($request->name)) {
$query->where('name', 'like', '%' . $request->name . '%');
}
if (isset($request->external_id) && !empty($request->external_id)) {
$query->where('external_id', 'like', '%' . $request->external_id . '%');
}
$perPage = $request->per_page ?? 20;
return $query->paginate((int) $perPage)->appends($request->all());
}
public function getDevice($request)
{
return Device::where('external_id', $request->id)->first();
}
public function searchDevicesAjax($term)
{
$query = Device::query();
$query->where(function ($query) use ($term) {
$query
->where('external_id', 'like', '%' . $term . '%')
->orWhere('name', 'like', '%' . $term . '%');
});
$query->select("id", DB::raw('concat(external_id, ", ", name) as text'));
return $query;
}
public static function save($data): Device
{
$device = Device::query()->where('external_id', $data['external_id'])->withTrashed()->first();
if (!$device) {
$device = new Device();
} else {
$device->deleted_at = null;
}
$device->fill($data);
$device->save();
return $device;
}
/**
* @param $data
* @param Device $device
*
* @return Device
*/
public static function update($data, $device): Device
{
$device->deleted_at = null;
$device->fill($data);
$device->update();
return $device;
}
public static function delete($data): array
{
$device = Device::where('external_id', $data['external_id'])->first();
if ($device) {
$ds = DevicesSchema::where('device_id', $device->id)->get();
DevicesSchema::where('device_id', $device->id)->delete();
Device::where('external_id', $data['external_id'])->delete();
foreach ($ds as $item) {
$check_schema = DevicesSchema::where('schema_id', $item->schema_id)->first();
if (!$check_schema) {
$schema = Schema::where('id', $item->schema_id)->first();
SchemaRepository::delete($schema->external_id);
}
}
return ['device_id' => 0, 'result' => 1];
} else {
return ['device_id' => 0, 'result' => 0];
}
}
}