You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.0 KiB
136 lines
4.0 KiB
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
use OwenIt\Auditing\Contracts\Auditable;
|
|
|
|
class CommonModel extends Model
|
|
{
|
|
//use \OwenIt\Auditing\Auditable;
|
|
use DynamicallyTableModelTrait;
|
|
|
|
protected $table;
|
|
protected $guarded = [];
|
|
public $split = ",";
|
|
|
|
// Overrides datetime object serialization
|
|
protected function serializeDate(\DateTimeInterface $date)
|
|
{
|
|
$carbonInstance = \Carbon\Carbon::instance($date);
|
|
return $carbonInstance->toDateTimeString();
|
|
}
|
|
|
|
public function getColumns()
|
|
{
|
|
$columns = [];
|
|
foreach (DB::select("describe {$this->table}") as $field) {
|
|
$type = (!Str::contains($field->Type, '(')) ? $field->Type : substr($field->Type, 0, strpos($field->Type, '('));
|
|
$columns[$field->Field] = $type;
|
|
}
|
|
return $columns;
|
|
}
|
|
|
|
/**
|
|
* filter request columns by fields
|
|
* @param $request
|
|
* @param array $additional
|
|
* @return array
|
|
*/
|
|
public function filterRequestColumns($request, $except = [])
|
|
{
|
|
if (gettype($request) == "object") {
|
|
if (method_exists($request, "input")) {
|
|
$request = $request->input();
|
|
} else {
|
|
abort(403);
|
|
}
|
|
}
|
|
|
|
$columns = $this->getColumns();
|
|
|
|
$return = [];
|
|
foreach ($request as $k => $v) {
|
|
if (!in_array($k, array_keys($columns)) || in_array($k, $except)) {
|
|
continue;
|
|
}
|
|
if ($k === "password") {
|
|
if (!$v) {
|
|
continue;
|
|
}
|
|
$v = Hash::make($v);
|
|
}
|
|
|
|
switch ($columns[$k]) {
|
|
case "json":
|
|
$v = json_encode($v, JSON_UNESCAPED_UNICODE);
|
|
break;
|
|
default:
|
|
if (is_array($v)) {
|
|
if (count($v) == count($v, 1)) {
|
|
$v = implode($this->split, $v);
|
|
} else {
|
|
$v = json_encode($v, JSON_UNESCAPED_UNICODE);
|
|
}
|
|
}
|
|
}
|
|
|
|
$return[$k] = $v;
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $tableName
|
|
* @param array $multipleData
|
|
* @return bool
|
|
*/
|
|
static function updateBatch($tableName = "", $multipleData = array())
|
|
{
|
|
if ($tableName && !empty($multipleData)) {
|
|
// column or fields to update
|
|
$updateColumn = array_keys($multipleData[0]);
|
|
$referenceColumn = $updateColumn[0]; //e.g id
|
|
unset($updateColumn[0]);
|
|
$whereIn = "";
|
|
|
|
$q = "UPDATE " . $tableName . " SET ";
|
|
foreach ($updateColumn as $uColumn) {
|
|
$q .= $uColumn . " = CASE ";
|
|
|
|
foreach ($multipleData as $data) {
|
|
$q .= "WHEN " . $referenceColumn . " = " . $data[$referenceColumn] . " THEN '" . $data[$uColumn] . "' ";
|
|
}
|
|
$q .= "ELSE " . $uColumn . " END, ";
|
|
}
|
|
foreach ($multipleData as $data) {
|
|
$whereIn .= "'" . $data[$referenceColumn] . "', ";
|
|
}
|
|
$q = rtrim($q, ", ") . " WHERE " . $referenceColumn . " IN (" . rtrim($whereIn, ', ') . ")";
|
|
|
|
// Update
|
|
return DB::update(DB::raw($q));
|
|
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static function generateCurdRouter($controller, $prefix)
|
|
{
|
|
$router = app()->make('router');
|
|
$router->get($prefix, "{$controller}@index");
|
|
$router->get("{$prefix}/create", "{$controller}@create");
|
|
$router->post("{$prefix}/store", "{$controller}@store");
|
|
$router->get("{$prefix}/edit/{id?}", "{$controller}@edit");
|
|
$router->post("{$prefix}/update/{id?}", "{$controller}@update");
|
|
$router->post("{$prefix}/delete", "{$controller}@delete");
|
|
}
|
|
}
|