ServiceAppAop.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Traits;
  3. use App\Services\LogService;
  4. use Illuminate\Contracts\Foundation\Application;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\Cache;
  7. trait ServiceAppAop
  8. {
  9. use TestableInstant;
  10. /**
  11. * 缓存过了
  12. * @param array $kvPairs
  13. * @return Collection|null
  14. */
  15. function get(array $kvPairs):?Collection{
  16. return Cache::remember($this->cachingKey($kvPairs), config('cache.expirations.serviceAutoCache'), function ()use($kvPairs) {
  17. $query = ($this->modelClass)::query();
  18. foreach ($kvPairs as $column => $value){
  19. if (is_array($value))$query->whereIn($column,$value);
  20. else $query->where($column,$value);
  21. }
  22. return $query->get();
  23. });
  24. }
  25. function set($target,array $kvPairs){
  26. $update = $target->update($kvPairs);
  27. Cache::forget($this->cachingKey($kvPairs));
  28. if(isset($kvPairs['id'])){
  29. Cache::forget($this->cachingKey(['id'=>$kvPairs['id']]));
  30. }
  31. return $update;
  32. }
  33. protected function cachingKey(array $kvPairs): string
  34. {
  35. ksort($kvPairs);
  36. return $this->modelClass.md5(json_encode($kvPairs));
  37. }
  38. protected function clearCache(array $kvPairs){
  39. Cache::forget($this->cachingKey($kvPairs));
  40. }
  41. function create(array $kvPairs){
  42. $materialBox=$this->get($kvPairs);
  43. if($materialBox->isNotEmpty())
  44. return $materialBox->first();
  45. $this->clearCache($kvPairs);
  46. return ($this->modelClass)::query()->create($kvPairs);
  47. }
  48. function firstOrCreate(array $kvPairs){
  49. $materialBox=$this->get($kvPairs);
  50. if($materialBox->isNotEmpty())
  51. return $materialBox->first();
  52. $this->clearCache($kvPairs);
  53. return $this->create($kvPairs);
  54. }
  55. /**
  56. * $returnInserted 设为true返回插入的内容,是通过插入的字段返查的,所以可能会不准(看字段是否能匹配)
  57. * @param array $targetsArrays
  58. * @param bool $returnInserted 设为true返回插入的内容
  59. * @param bool $createdAtOn
  60. * @param bool $updatedAtOn
  61. * @return Collection|null
  62. */
  63. function insert(array $targetsArrays, $returnInserted=false, $createdAtOn=true,$updatedAtOn=true): ?Collection
  64. {
  65. if($createdAtOn||$updatedAtOn)$now = now();
  66. foreach ($targetsArrays as &$target){
  67. if($createdAtOn)$target['created_at']= $now;
  68. if($updatedAtOn)$target['updated_at']= $now;
  69. }
  70. ($this->modelClass)::query()->insert($targetsArrays);
  71. LogService::log(__METHOD__, __FUNCTION__, json_encode($targetsArrays) .
  72. '||' . json_encode(array_slice(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), 0, 4)));
  73. if(!$returnInserted)return null;
  74. if(!$targetsArrays||count($targetsArrays)==0)return null;
  75. return ($查回插入内容,不保证准=function ()use($targetsArrays){
  76. $query=($this->modelClass)::query();
  77. foreach ($targetsArrays as &$target){
  78. $query->orWhere(function($subQuery)use($target){
  79. foreach ($target as $key=>$val){
  80. $subQuery->where($key, $val);
  81. }
  82. });
  83. }
  84. return $query->get();
  85. })();
  86. }
  87. }