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.

152 lines
4.5 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;
use Spatie\Permission\Models\Role;
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");
}
/**
* 判断是否有导出权限
*/
public static function checkExport()
{
$userId = auth()->id();
$roleId = Role::where('name', 'like', '%导出%')->where('guard_name', 'admin')->value('id');
return DB::table('model_has_roles')
->where('role_id', $roleId)
->where('model_type', 'App\Admin')
->where('model_id', $userId)
->count();
}
}